RabbitMQ入门
2023-04-18 本文已影响0人
CoderInsight
1,AMQP协议
AMQP是缩写,对应英文:Advance Message Queue Protocol --> 高级消息队列协议。
2,AMQP的核心概念
![](https://img.haomeiwen.com/i7470044/6db60ac298b062df.png)
- Publisher Application:生产者;
-
Sever(
Virtual host、Exchange、MessageQueue
):又称之为Broker,接收客户端的连接,实现AMQP实体服务; - Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个VirtualHost里面不能有相同名称的Exchange或Queue;一般是隔离不同的项目或者不同的应用的。
- Exchange:交换器,通过路由键来实现Exchange和MessageQueue之间绑定的关系,通过RoutingKey进行关联;即生产者生产出Message并投递到Exchange上,Exchange【交换机】接收到信息之后,会和Queue【队列】根据 Routing Key【路由键】进行绑定,然后根据Binding key【绑定键】转发消息到绑定的队列中。而Exchange交换器又分为好多种:直连交换器、扇形交换器、主题交换器、首部交换器。
- Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息。
- Queue:也称为Message Queue,用来保存消息知道发送给消费者;一个消息可投入一个或对个队列。
- Consumer:消费者;
- Channel:信道,多路复用连接中的一条独立的双向数据流通道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。
- Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的路由键(Routing Key)、优先级(Priority)、是否持久化(delivery-mode)延迟等高级特性;Body则就是消息体内容。
-
Binding:Exchange和Queue之间的虚拟连接, binding中可以包含routing key。
用于消息队列和交换器之间的管理。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则。所以可以将交换器理解成一个由绑定构成的路由表。
3,RabbitMQ环境部署
[[RabbitMQ-在线安装-单节点|RabbitMQ部署参考文档]]
(1),交换机的类型
- 扇形交换器(Fanout exchange):扇形交换机是最基本的交换机类型,扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要思考,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的
- 直连交换器(Direct exchange):使用广播的方式进行消息的推送,基于直连交换机可以实现RPC【远程过程调用模式】,异步调用。具体的步骤如下:
- 客户端即是生产者就是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。
- 服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到方法返回的结果。
- 服务端将RPC方法的结果发送到RPC响应队列。
- 客户端(RPC调用方)监听RPC响应队列,接收到RPC调用结果。
- 主题交换器(Topic exchange):Topic Exchange 是 RabbitMQ 中最常用的交换器之一,它根据消息的路由键将消息路由到一个或多个队列中。Topic Exchange 可以使用通配符来匹配路由键。例如,如果一个消息的路由键为 "
com.example.stock.usd
",那么可以使用 "#.usd
" 的匹配模式来将该消息路由到绑定键 "com.example.stock.usd
"、"usd
" 或者 "com.example.#.usd
" 的队列中。这种通配符匹配机制非常适合处理一些动态多变的请求,并且可以在不破坏系统架构的情况下进行扩展和调整。-
*
表示一个单词; -
#
表示任意数量(零个或多个)单词;
-
- 首部交换器(Headers exchange):首部交换机是忽略routing_key的一种路由方式。路由器和交换机路由的规则是通过Headers信息来交换的,这个有点像HTTP的Headers。
5,RabbitMQ消息流转
![](https://img.haomeiwen.com/i7470044/a44997432a8284e6.png)
(1),生产者
1,生产者在推送消息之前,首先会和Server建立 Connection【连接】;
2,然后找到对应Virtual Host【虚拟主机】,然后将带有Routing Key【路由键】消息推送到Exchange【交换机】。
3,Exchange【交换机】接收到信息之后,会和Queue【队列】根据 Routing Key【路由键】进行绑定,然后根据Binding key【绑定键】转发消息到绑定的队列中。
(2),消费者
1,消费者在拉取消息之前,首先会和Server建立 Connection【连接】;
2,然后会请求队列中的消息;
3,消费者确认接收到消息了之后,RabbitMQ会将队列中已经被处理的消息删除
- 关于自动确认机制:消费者在订阅队列的时候,可以指定 autoAck 参数,当 autoAck 等于 false时, RabbitMQ会等待消费者显式地回复确认信号后才从内存(或者磁盘)中移去消息(实质上是先打上删除标记,之后再删除)。
当 autoAck 等于 true 时, RabbitMQ 会自动把发送出去的消息置为确认,然后从内存(或者磁盘)中删除,而不管消费者是否真正地消费到了这些消息。
采用消息确认机制后,只要设置 autoAck 参数为 false ,消费者就有足够的时间处理消息,不用担心处理消息过程中消费者进程挂掉后消息丢失的问题。因为 RabbitMQ 会一直等待持有消息直到消费者显式确认收到消息。