RabbitMQ的工作模式

(一)工作模式

RabbitMQ有7种工作模式来进行消息传递,我们上一篇博客就是简单模式

1.简单模式(simple)

 也就是点对点的形式

P就是生产者,C就是消费者,Queue就是消息队列(生产者向queue种放消息,consume从中取消息)

特点:只有一个生产者和一个消费者,消息只被消费一次,又叫点对点模式

2.工作队列(work queue)

一个生产者P,多个消费者,在多个消息的情况下,queue会把消息分派给不同的消费者,每个消费者会收到不同的消息(多个消费者共同处理一个生产者的消息)

特点:消息不会重复,分配给不同消费者

适用场景:集群环境中共同处理问题

3.发布/订阅(publish/subscribe)

图中X叫交换机,之所以上面两个图没画交换机是因为上面两个交换机只有映射(定向)作用,而这里的交换机起到了其他作用

那我们这里就先插入讲一下交换机的分类

exchange:交换机

作用:接收生产者发送的消息,并且按照一定的规则映射到一个或者多个的消息队列中

分类:RabbitMQ交换机有四种类型,fanout,direct,topic,headers,不同类型有着不同的路由策略,AMQP协议里还有另外两种(system和自定义)但是RabbitMQ中没有就不多说

1.fanout(广播):把消息交给所有绑定到交换机的队列(也就是上述的发布订阅模式)

2.direct(定向):把消息(消息中有一个routing key)交给符合指定binding key的队列(routing模式)

3.topic(通配符):把消息交给符合routing模式的队列(topics模式)

4.headers类型:不依赖于路由键的匹配规则来路由消息,⽽是根据发送的消息内容中的 headers属性进⾏匹配.headers类型的交换器性能会很差,⽽且也不实⽤,基本上不会看到它的存在.

交换机只负责转发消息,没有存储消息的能力,因此如果没有任何队列与exchange绑定时,消息就会丢失

那我们通过什么进行绑定?

Routing Key:生产者将消息发送给交换机时,只当的字符串,用来告诉交换机如何处理这个消息

Binging key: RabbitMQ中通过bindingkey将交换机与队列关联起来,在绑定时一般指定一个binding key,这样Rabbitmq就知道如何正确把消息映射到队列了

就比如这张图,如果我们生产者给交换机的routing key是orange,那么消息就会到Q1 

其实Binding key也是routing key的一种,为了避免我们混淆

我们可以认为,生产者(发送消息)给交换机的是Routingkey,在交换机绑定队列时是Binding key

4.路由模式(Rounting)

我们依然用这张图

我们可以说路由模式是发布订阅模式的变种,通过我们刚刚说的Routingkey和Bindingkey进行映射到对应的队列中,所以区别就是发布订阅模式是无差别发送给任何此交换机绑定的队列中,而路由模式要在此交换机绑定的队列中找到满足Routingkey和Bindingkey相等的队列再传消息

5.通配符模式(Topic)

  路由模式的升级版,也就是我们的Bindingkey可以支持通配符了,让我们的映射更加灵活,与路由模式思路是相同的

每个.分割一个单词,*只可以表示一个单词,#可以表示多个单词

6.rpc通信

  在rpc通信中没有生产者消费者,或者说都是生产者也都是消费者,通过两个队列实现了一个回调过程

 首先客户端先给一个队列中放消息,放的消息中的属性设置了replyto和correlatioin-id,replyto是为了告诉服务端一会你返回的消息放到哪一个队列中,correlatioin-id是为了确保是否响应的是同一个数据

  然后服务器从队列中拿到这个消息解析后处理请求,之后把响应消息放到replyto指定队列中并且设置correlatioin-id与客户端传送的相同

 7.发布确认(Publisher Confirms)

发布确认是RabbitMQ提供的一种确保消息能狗可靠发送到RabbitMQ服务器的机制,我们会在之后详细的说,这里只大概说一下

如果我们要使用发布确认,生产者需要将channel设置为confirm模式(channel.confirmSelect()),然后我们发布的每一条消息都会获得一个唯一的id,此id会和消息进行关联,方便确认消息的状态,当消息被服务器接收后会给我们返回一个ack给生产者(包含刚刚说的唯一id),如果没收到会返回nack

然后我们生产者又分为三种确认方式,单个确认方式,批量确认方式,异步确认方式

单个确认就是我们要等待服务器给我们返回ack或者nack后才可以发送下一条消息,批量确认是一次性发多个消息,然后服务器会给我们返回ack或者nack还有id来表示从这个id以前的数据都确认了。异步就是边发送边确认,具体我们之后会说

(二)SpringBoot整合RabbitMQ

  我们这里不全部演示,因为简单模式跟工作模式很像,路由模式和通配符模式很像,,所以这两个模式我们就不写了

 首先我们还是要先引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

然后我们要添加配置

spring.rabbitmq.addresses=amqp://**:w85315678@62.234.46.219:5672/test

1.工作模式

接下来我们要编写生产者代码

@RequestMapping("/producer")
@RestController
public class Produce {@Autowiredprivate RabbitTemplate rabbitTemplate;@RequestMapping("/work")public String work(){rabbitTemplate.convertAndSend("", Constant.WORK_QUEUE,"WORK");return "发送成功";}
}

然后我们看返回结果

 ,这条消息已经成功的到我们队列中了,之后我们要编写消费者代码

@Component
public class WorkConsume {@RabbitListener(queues = Constant.WORK_QUEUE)public void listenerQueue(String message){System.out.println("1接收到消息: "+message);}@RabbitListener(queues = Constant.WORK_QUEUE)public void listenerQueue2(String message){System.out.println("2接收到消息: "+message);}
}

我们已经成功接收到消息

那我们在这里讲一下用到的类RabbitTemplate 这个就是用来发送消息的,注意我们包不要导错了

再来看这个参数,首先就是交换机名称,然后就是我们要传入的routingkey用来映射到队列中,然后最后一个就是要传入的消息,可以是String类型,也可以是一个对象等等 

然后我们来看@RabbitListener这个注解,这是用来监听RabbitMQ队列的注解,通过这个注解,可以定义一个方法以便从RabbitMQ队列中接收消息,该注解支持多种参数类型,这些参数类型代表了从RabbitMQ队列中接收到的消息

1. String :返回消息的内容

2. Message ( org.springframework.amqp.core.Message ):Spring AMQP的 Message 类,返回原始的消息体以及消息的属性,如消息ID,内容,队列信息等.

 3. Channel ( com.rabbitmq.client.Channel ):RabbitMQ的通道对象,可以⽤于进⾏更 ⾼级的操作,如⼿动确认消息

如果我们接收的是Message

就大概是这个样子 

2.发布订阅模式

我们上面的发布订阅图中对比于工作模式多了一个exchange角色,之所以工作模式没有,是因为我们直接使用的是虚拟机自带的交换机

那发布订阅的代码步骤跟工作模式差不多,但是多了一个声明交换机和交换机与队列绑定的步骤

我们来看看生产者代码

@RequestMapping("/fanout")public String fanout(){rabbitTemplate.convertAndSend(Constant.FANOUT_EXCHANGE,"","WORK");return "发送成功";}

 再来看看交换机和队列绑定的代码

 @Bean("fanoutQueue1")public Queue fanoutQueue1(){return QueueBuilder.durable(Constant.FANOUT_QUEUE1).build();}@Bean("fanoutQueue2")public Queue fanoutQueue2(){return QueueBuilder.durable(Constant.FANOUT_QUEUE2).build();}@Bean("fanoutExchange")public FanoutExchange fanoutExchange(){return ExchangeBuilder.fanoutExchange(Constant.FANOUT_EXCHANGE).durable(true).build();}@Beanpublic Binding fanoutBinding1(FanoutExchange exchange,@Qualifier("fanoutQueue1")Queue queue){return BindingBuilder.bind(queue).to(exchange);}@Beanpublic Binding fanoutBinding2(FanoutExchange exchange,@Qualifier("fanoutQueue2")Queue queue){return BindingBuilder.bind(queue).to(exchange);}

我们发现已经成功发送了 

我们来写消费者的代码

3.通配符模式

 交换机类型为Direct时,会把消息交给符合指定routingkey的队列.队列和交换机的绑定,不是任意的绑定了,⽽是要指定⼀个RoutingKey(路由key)消息的发送⽅在向Exchange发送消息时,

也需要指定消息的RoutingKey Exchange也不再把消息交给每⼀个绑定的key,⽽是根据消息的RoutingKey进⾏判断,

只有队列的 RoutingKey和消息的RoutingKey能够匹配,才会接收到消息

声明交换机和队列代码

@Bean("topicExchange")public TopicExchange topicExchange(){return ExchangeBuilder.topicExchange(Constant.TOPIC_EXCHANGE).durable(true).build();}@Bean("topicQueue1")public Queue topicQueue1(){return QueueBuilder.durable(Constant.TOPIC_QUEUE1).build();}@Bean("topicQueue2")public Queue topicQueue2(){return QueueBuilder.durable(Constant.TOPIC_QUEUE2).build();}@Beanpublic Binding topicBind1(@Qualifier("topicExchange") TopicExchange exchange,@Qualifier("topicQueue1")Queue queue){return BindingBuilder.bind(queue).to(exchange).with("*.error");}@Beanpublic Binding topicBind2(@Qualifier("topicExchange") TopicExchange exchange,@Qualifier("topicQueue2")Queue queue){return BindingBuilder.bind(queue).to(exchange).with("#.info");}@Beanpublic Binding topicBind3(@Qualifier("topicExchange") TopicExchange exchange,@Qualifier("topicQueue2")Queue queue){return BindingBuilder.bind(queue).to(exchange).with("*.error");}

生产者代码

  @RequestMapping("/topic/{routingkey}")public String topic(@PathVariable("routingkey")String routingkey){rabbitTemplate.convertAndSend(Constant.TOPIC_EXCHANGE, routingkey,"topic");return "发送成功";}

 消费者代码

@Component
public class Topic {@RabbitListener(queues = Constant.TOPIC_QUEUE1)public void listenerQueue1(String message){System.out.println("topic1接收到消息: "+message);}@RabbitListener(queues = Constant.TOPIC_QUEUE2)public void listenerQueue2(String message){System.out.println("topic2接收到消息: "+message);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/2441.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件

bundle.json 文件内容如下所示&#xff1a; 下面是对各个字段的解释&#xff1a; 1. name: "ohos/demos" - 这是组件或项目的名称&#xff0c;这里表示它属于 OHOS&#xff08;OpenHarmony OS&#xff09;生态系统下的一个名为"demos"的组件。 2. descri…

JavaScript-正则表达式方法(RegExp)

RegExp 对象用于将文本与一个模式匹配。 有两种方法可以创建一个 RegExp 对象&#xff1a;一种是字面量&#xff0c;另一种是构造函数。 字面量由斜杠 (/) 包围而不是引号包围。 构造函数的字符串参数由引号而不是斜杠包围。 new RegExp(pattern[, flags])一.符集合 1.选择…

信凯科技业绩波动明显:毛利率远弱行业,资产负债率偏高

《港湾商业观察》施子夫 1月8日&#xff0c;深交所官网显示&#xff0c;浙江信凯科技集团股份有限公司&#xff08;以下简称“信凯科技”&#xff09;主板IPO提交注册。 自2022年递交上市申请&#xff0c;信凯科技的IPO之路已走过两年光景&#xff0c;尽管提交注册&#xff0…

Windows远程桌面网关出现重大漏洞

微软披露了其Windows远程桌面网关&#xff08;RD Gateway&#xff09;中的一个重大漏洞&#xff0c;该漏洞可能允许攻击者利用竞争条件&#xff0c;导致拒绝服务&#xff08;DoS&#xff09;攻击。该漏洞被标识为CVE-2025-21225&#xff0c;已在2025年1月的补丁星期二更新中得到…

4G DTU赋能智能配电环网柜通信运维管理

在智能电网建设持续推进下&#xff0c;智能配电环网柜作为配电网的关键节点设备&#xff0c;其稳定、高效运行对保障电力可靠供应是品质生活的基本保障。通信系统是实现智能配电环网柜远程监控与管理的核心纽带&#xff0c;而4G DTU&#xff08;数据传输单元&#xff09;凭借其…

STC的51单片机LED点灯基于KEIL

前言&#xff1a; 该文源于回答一个朋友的问题&#xff0c;代码为该朋友上传&#xff0c;略作修改&#xff0c;在此说明问题以及解决问题的思路&#xff0c;以减少新手错误。 电路图&#xff1a; 该位朋友未上传电路图&#xff0c;说明如下&#xff1a; stc8g1k08a-sop8控制…

C++ 文字识别OCR

一.引言 文字识别&#xff0c;也称为光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;&#xff0c;是一种将不同形式的文档&#xff08;如扫描的纸质文档、PDF文件或数字相机拍摄的图片&#xff09;中的文字转换成可编辑和可搜索的数据的技术。随着技…

基于springboot的自习室预订系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…

TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG

注&#xff1a;本文为“TCP 连接状态标识”相关文章合辑。 TCP 的状态&#xff1a;SYN, FIN, ACK, PSH, RST, URG 简介及 ACK 确认机制 llzhang_fly 于 2020-09-19 05:25:26 发布 1、TCP 的状态 FLAGS 字段状态 在 TCP 层&#xff0c;有个 FLAGS 字段&#xff0c;这个字段有…

Spring AI 从入门到实践

​Spring AI 从入门到实践 1.什么是Spring AI 2.使用Spring Boot&Spring AI快速构建AI应用程序 3.ChatClient&Chat Model简化与AI模型的交互 4.Spring AI Prompt:与大模型进行有效沟通 5.结构化输出大模型响应 6.实战:AI聊天机器人 Ben技术站关注Java技术&#x…

1月13日学习

[HITCON 2017]SSRFme 直接给了源代码&#xff0c;题目名称还是ssrf&#xff0c;那么该题大概率就是SSRF的漏洞&#xff0c;进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头&#xff0c;如果存在&#xff0c;则将其拆分为数组&#xff0c;并将第一个 IP 地址…

【RDMA学习笔记】1:RDMA(Remote Direct Memory Access)介绍

从帝国理工的PPT学习。 什么是RDMA Remote Direct Memory Access&#xff0c;也就是Remote的DMA&#xff0c;是一种硬件机制&#xff0c;能直接访问远端结点的内存&#xff0c;而不需要处理器介入。 其中&#xff1a; Remote&#xff1a;跨node进行数据传输Direct&#xff…

Docker

1. 初始Docker 1.1. 什么是Docker&#xff1f; 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环…

Deep4SNet: deep learning for fake speech classification

Deep4SNet&#xff1a;用于虚假语音分类的深度学习 摘要&#xff1a; 虚假语音是指即使通过人工智能或信号处理技术产生的语音记录。生成虚假录音的方法有"深度语音"和"模仿"。在《深沉的声音》中&#xff0c;录音听起来有点合成&#xff0c;而在《模仿》中…

Navicat Premium 原生支持阿里云 PolarDB 数据库

近日&#xff0c;我司旗下的 Navicat Premium 软件通过了阿里云 PolarDB 数据库产品生态集成认证&#xff0c;这标志着 Navicat 通过原生技术全面实现了对秒级弹性、高性价比、稳定可靠的PolarDB 数据库三大引擎&#xff08;PolarDB MySQL版、PolarDB PostgreSQL版和 PolarDB f…

LabVIEW光流算法的应用

该VI展示了如何使用NI Vision Development Module中的光流算法来计算图像序列中像素的运动矢量。通过该方法&#xff0c;可以实现目标跟踪、运动检测等功能&#xff0c;适用于视频处理、机器人视觉和监控领域。程序采用模块化设计&#xff0c;包含图像输入、算法处理、结果展示…

JAVA:在IDEA引入本地jar包的方法(不读取maven目录jar包)

问题&#xff1a; 有时maven使用的jar包版本是最新版&#xff0c;但项目需要的是旧版本&#xff0c;每次重新install会自动将mavan的jar包覆盖到项目的lib目录中&#xff0c;导致项目报错。 解决&#xff1a; 在IDEA中手动配置该jar包对应的目录。 点击菜单File->Projec…

升级 SpringBoot3 全项目讲解 — 为什么 SpringBoot3 应该抛弃 Maven,搭配 Gradle 来使用?

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 随着 Spring Boot 3 的发布&#xff0c;许多开发者开始考虑如何将现有项目升级到最新版本。Spring Boot 3 带来了许多新特性&#xff0c;包括对 Java 17 的支持、更好的性能优化以及对 G…

大疆上云API基于源码部署

文章目录 大疆上云API基于源码部署注意事项1、学习官网2、环境准备注意事项3、注册成为DJI开发者4、下载前后端运行所需要的包/依赖前端依赖下载后端所需要的Maven依赖包 用到的软件可以在这里下载5、MySQL数据库安装安装MySQL启动MySQL服务在IDEA中配置MySQL的连接信息 6、Red…