RabbitMQ工作流程详解

news/2025/1/16 3:45:16/

1 生产者发送消息的流程

(1)生产者连接RabbitMQ,建立TCP连接(Connection),开启信道(Channel)

(2)生产者声明一个Exchange (交换器),并设置相关属性,比如交换器类型、是否持久化等

(3)生产者声明一个队列井设置相关属性,比如是否排他、是否持久化、是否自动删除等

(4)生产者通过bindingKey (绑定Key) 将交换器和队列绑定(binding)起来

(5)生产者发送消息至RabbitMQ Broker,其中包含routingKey (路由键)、交换器等信息

(6)相应的交换器根据接收到的routingkey查找相匹配的队列。

(7)如果找到,则将从生产者发送过来的消息存入相应的队列中。

(8)如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者

(9)关闭信道。

(10)关闭连接。

2 消费者接收消息的过程

(1)消费者连接到RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)。

(2)消费者向RabbitMQ Broker请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作

(3)等待RabbitMQ Broker回应并投递相应队列中的消息,消费者接收消息。

(4)消费者确认(ack)接收到的消息。

(5) RabbitMQ从队列中删除相应己经被确认的消息。

(6)关闭信道。

(7)关闭连接。

3 Connection和Channel关系

生产者和消费者,需要与RabbitMQ Broker建立TCP连接,也就是Connection。一旦TCP连接建立起来,客户端紧接着创建一个AMQP 信道(Channel),每个信道都会被指派一个唯一的ID。信道是建立在Connection之上的虚拟连接,RabbitMQ处理的每条AMQP指令都是通过信道完成的。

为什么不直接使用TCP连接,而是使用信道?

RabbitMQ采用类似NIO的做法,复用TCP连接,减少性能开销,便于管理。

当每个信道的流量不是很大时,复用单一的Connection可以在产生性能瓶颈的情况下有效地节省TCP连接资源。

当信道本身的流量很大时,一个Connection就会产生性能瓶颈,流量被限制。需要建立多个Connection,分摊信道。具体的调优看业务需要。

信道在AMQP中是一个很重要的概念,大多数操作都是在信道这个层面进行的。

channe1.exchangeDeclare
channe1.queueDeclare
channe1.basicPublish
channe1.basicConsume
//

RabbitMQ相关的API与AMQP紧密相连,比如channel.basicPublish对应AMQP的Basic.Publish命令。


http://www.ppmy.cn/news/1029313.html

相关文章

JavaScript【BOM】

【BOM】 原创内容,转载请注明出处! 一、BOM是什么 BOM(Browser Object Model,浏览器对象模型)是 JS 与 浏览器窗口交互的接口。 一些与浏览器改变尺寸、滚动条滚动相关的特效,都要借助 BOM 技术。 二、w…

Redis进阶(3)——在Linux上基于Docker容器Redis搭建一主二从三哨兵 SpringBoot整合Redis哨兵

目录 引出redis主从搭建:一主2从6389Master准备文件redis.confredis.log日志文件运行容器查看日志方式tail 6390Slave6391Slave 创建3哨兵创建文件夹sentinel创建运行哨兵容器问题:脑裂问题 SpringBoot整合Redis哨兵启动1主2从,3哨兵pom.xml文…

【JS自用模板】自动点击选课的操作模板

以激动点击课程为案例复习一下基本前端,容易涉及的问题包括如何提取object类的数字,setTimeout为什么不起作用? 具体思路是,此处会立刻选中符合条件的页面元素打开,然后1小时后会刷新页面,相应地播放页面也…

java:注解

一、注解 1.1:注释:很容易知道就是让自己看,或者别人方便阅读你的代码 1.2:注解的作用: 1) 不是程序本身,可以对程序作出解释。(这一点跟注释没什么区别) 2) 可以被其他程序(比如:编译器等)…

字符串编码和解码,encodeURIComponent和decodeURIComponent用法

使用js内置函数进行编码解码 我们使用 JavaScript 中的 encodeURIComponent() 函数将 Unicode 字符串 unicodeString 编码为 UTF-8,并将结果存储在 utf8String 变量中。编码后的字符串将包含一些特殊字符和百分比编码。 然后,我们使用 decodeURICompone…

【Three.js】遮挡剔除

背景 考虑到场景中模型顶点过多会让fps过低,所以想把相机看不到的模型从场景中移除,来提高渲染性能,但是后续测试结果让我恍然大悟。虽然场景中的顶点数降低了很多,但是每次渲染检查遮挡的过程本身就是一个消耗性能的行为&#x…

STM32--TIM定时器(1)

文章目录 TIM简介定时器类型 通用定时器预分频器时序计数器时序定时中断基本结构TIM内部中断工程TIM外部中断工程 TIM简介 STM32的TIM(定时器)是一种非常常用的外设,用于实现各种定时和计数功能。它是基于时钟信号进行计数,并在计…

Vue中自定义.js变量

1、定义.js文件 order.js文件内容: // 订单是否报账 const EXPENESS_STATUS_NO0; const EXPENESS_STATUS_YES1; // 状态 0-未发货 1-发货 2-确认收获 const STATUS_NO0; const STATUS_SEND1; const STATUS_DELIVERY2; // 如何不加这个,vue中引…