保证消息可靠性
生产者发送消息到broker的可靠性
服务端确认机制
- channel设置为事务模式(transaction模式):缺点:阻塞、性能下降;消耗额外的性能,不建议生产环境使用。
- confirm模式:waitForConfirm(),发送成功后会confirm;可以批量确认,提升性能;还可以异步确认,边发送边确认。
交换机的可靠性(路由保证)
- mandatory设置成true,并添加ReturnListener,假如路由失败会收到回调消息(假如mandatory为false,路由失败会丢弃消息)。
- 设置交换机的备份交换机。路由失败的时候会到对应的备份交换机。
队列的可靠性
- 队列持久化
- 交换机持久化
- 消息持久化
- 集群
消费端的可靠性
消费者确认机制
- ACK机制,默认自动确认(接收到消息就确认,并不管后面的处理逻辑),可以设置成手动确认。
防止重复消费消息
为什么消息会重复?
消费端回调响应:假如生产者未收到回调,重发(重发间隔、重发次数)。
如何幂等处理消息
业务消息必须有唯一的业务id,消息id。即msgId、bizId。
数据库中的唯一业务id保证幂等。
redis存消息id保证幂等。
保证服务可靠
RabbitMQ集群
集群目的:高可用、负载拓展
集群如何识别:通过erlang.cookie
集群节点类型:disc(元数据存储在磁盘中)、RAM(元数据在内存中)。至少需要一个磁盘节点。
-
普通集群
-
镜像队列
镜像队列会复制队列消息
VRRP 虚拟路由冗余协议
KeepAlived:负载、高可用
资源管理
谁来创建exchange、queue:消费者
面试题
消息队列的作用和使用场景
削峰、异步、解耦
Channel和vhost的作用是什么
复用连接、vhost提升硬件利用率,资源隔离
RabbitMQ有哪些路由方式,适合在什么场景使用
Direct、Topic、Fanout、Headers
交换机和队列、队列和消费者的绑定关系
多对多
无法被路由的消息去了哪里
备份交换机;假如设置了mandatory为true,有回调消息;假如没其他措施,则会丢失
消息在什么时候会变成死信
消息被拒绝;消息到达过期时间;队列已满。
RabbitMQ怎么实现延迟队列
通过死信队列+TTL,消息过期后会到死信交换机中,进一步到达死信队列。
消息丢失?
发送者->交换机->队列->消费者,从整个链路分析
一个队列最多可以存多少条消息
取决于硬件配置,和最大数量参数。
如何提高消费速率
增加消费者
如何动态创建消费者和队列
在ListenerContainer设置消费者数量
保证消息顺序性
一个队列对应一个消费者
消息堆积怎么处理
寻找堆积的原因,代码问题重启。速率问题,优化代码。清空队列之后重发消息。
MQ选型分析
- 使用和管理
- 性能:并发性,吞吐量,消息堆积能力
- 功能
- 可用,持久化,可靠性