消息丢失场景
消息从生产者写入到消息队列的过程
问题原因:
网络抖动
解决办法:
事务
在生产者发送消息之前,通过channel.txSelect开启一个事务,接着发送消息, 如果消息投递失败,进行事务回滚channel.txRollback,然后重新发送, 如果消息投递成功,就提交事务channel.txCommit。
缺点:同步操作。生产者吞吐量大大降低。发布者确认
一旦消息被投递到所有匹配的队列之后,RabbitMQ就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一deliveryTag和multiple参数),这就使得生产者知晓消息已经正确到达了目的地。
- 其他
- 使用mandatory 设置true:不可路由消息回发到生产者
- 利用备份交换机(alternate-exchange):处理无法路由到队列的消息
消息在消息队列中的存储场景
问题原因:
- 持久化了Message,没有持久化队列
- 唯一的磁盘节点宕机
解决办法:
1、消息持久化+队列持久化
消息设置delivery-mode为2,队列设置为durable
2、使用HA队列
发布者发送消息到集群中的任何节点。RabbitMQ节点同步队列中消息的状态。发布的消息被放入队列,并存储在每台服务器上。
3、集群设置>=1的磁盘节点。
磁盘节点保存集群的运行时状态。确保有多个磁盘节点,保证故障场景下的可靠性。集群恢复时,需要注意磁盘节点的启动顺序。
消息被消费者消费的过程
问题原因:错误代码
解决办法:
1、使用消费者手动确认消费
2、消费者程序使用事务提交和回滚批量操作。