RabbitMQ
结构模型

-
Producer:创建消息发布到RabbitMQ中。
-
消息包含标签和消息体。
-
-
Consumer:订阅队列,消费存储在队列中的消息。
-
Broker:可看作RabbitMQ服务器。
-
Queue:用于存储消息。
-
Name
-
Durable:消息代理重启后,队列依旧存在
-
Exclusive:只能被一个连接使用,连接关闭后队列删除
-
Auto-delete:最后一个消费者退订后删除
-
Arguments:完成TTL的额外功能
-
-
Exchange:交换机
-
将消息路由到一个或多个队列中,路由不到则返回给Producer或者丢弃。
-
交换机状态:持久,暂存。
-
类型:fanout(广播到所有绑定的队列中),topic(可以使不同源的消息到达同一个队列,通配符),direct(路由键完全匹配),headers。
-
-
Routing Key:路由键指定消息的路由规则。
-
Blinding Key:通过绑定将交换机和队列关联起来。
-
Connection: TCP连接。
-
Channel:信道复用TCP连接,节省性能开销,便于管理。
-
vhost:在单独的代理上实现多个隔离环境。
AMQP协议
-
应用层协议。RabbitMQ采用Erlang语言实现AMQP的消息中间件。
消息机制
-
消息确认:消费者在没有回执的情况下挂了,AMQP代理会将消息重新投递给注册到此队列的消费者,如果没有,则等待消费者注册,再次投递。
-
拒绝消息:销毁或者重新放入队列。
-
预读消息:明确收到回执前消费者能够接收多少消息,发布消息时能够负载均衡和提高吞吐量。
-
消息持久化:与交换机和队列的持久化无关,消息存储在磁盘上。
消息积压
-
先修复并停止consumer。
-
临时扩大queue资源和consumer资源加速消费。
-
消费完成恢复consumer。
消息过期
-
批量重导
message是否有数量限制
-
没有,但消息过多会导致处理效率下降
消息正确发送
-
发送方确认机制:将信道设置成确认模式,在信道上发布的消息会指派唯一的ID。一旦消息被发送至RabbitMQ,信道会发送一个确认给生产者。如果消息丢失,会发送一条nack消息。
消息正确消费
-
autoACK=false,接收方确认机制:消费者接受并确认消息之后,消息队列才能安全地将信息从队列中删除。
-
autoACK=true,RabbitMQ会自动把发送出去的消息置为确认,然后从内存或磁盘中删除
-
Rabbit仅通过Consumer的连接中断来确认是否需要重新发送。
-
断开或取消订阅会重新分发给下一个订阅的消费者。
-
未断开则认为消费者繁忙,不会分发更多的消息。
-
消息重复投递或重复消费
-
重复投递:生产者发送的消息生成inner-msg-id作为去重和幂等的依据,避免重复的消息进入队列。
-
重复消费:消息消费时需要bizId作为去重和幂等的依据。
消息传递
-
RabbitMQ基于信道的方式传递数据,且信道数量没有限制。
消息分发
-
以循环的方式发送给消费者。
-
每条消息只会发送给一个订阅的消费者。
消息路由
-
根据交换机的路由规则,将routing key和blinding key进行匹配,将消息投递到相应队列中。
消息不丢失
-
消息持久化,消息队列必须持久化。
-
持久化日志文件:
-
发布持久性消息到持久性交换器上,RabbitMQ会在消息提交到日志文件后才发送响应。
-
消费者消费持久化消息后,日志文件将这条消息标记为等待垃圾收集。
-
持久化消息被消费前RabbitMQ重启,RabbitMQ会重新发布持久化日志文件中的消息到合适的队列中。
-
优缺点
-
解耦,拆分系统。
-
异步处理,减少响应时间。
-
消息分发。
-
流量削峰。
-
消息缓冲。
-
可用性降低,消息队列出问题影响业务。
高可用
| 集群 | 镜像队列 |
|---|---|
![]() |
![]() |
-
集群扩展吞吐量,但不会备份消息。
-
备份消息通过镜像队列,消息实体主动在镜像节点之间同步。
-
缺点:集群内部的同步通讯会占用大量带宽。
-
如何保证数据一致性
-
生产者确认机制:消息持久化后异步回调通知生产者,保证消息已经发出去。
-
消息持久化:设置消费持久化。
-
消费者确认机制:消费者成功消费信息之后,确认之后保证消息已经消费。
RabbitMQ与消费者之间的关系
-
一个队列可以绑定多个消费者。
-
消息默认以循环的方式发送给消费者。

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。



浙公网安备 33010602011771号