消息丢失的几种可能性和解决方案
RabbitMQ 消息投递过程

发送端层面
-
发送消息到达Broker消息丢失。
解决方案: 1.事务机制,发送失败即回滚操作(同步操作) 2. 发送方确认机制(publisher confirm)通过做法是发送消息对消息持久化,例如存储到数据库中,ack后更改状态发送成功状态(rabbitTemplate.setConfirmCallback)
-
代码层面配置考虑不全导致消息丢失,例如,没有配置相应的队列消息
解决方案:1.使用mandatory设置true(rabbitTemplate.setMandatory(true);)
RabbitMQ服务层面
-
消息未完全持久化,机器重启后,消息全部丢失
解决方案:交换机(创建DirectExchange),队列(设置durable,默认是持久化),消息持久化(将待消费的消费持久化)。
消费端层面
-
消息发送到消费端,消费端挂了
解决方案:提供了消息确认机制(只有消费端设置autoAck为false)
另外
- 提供补偿机制,对于消费失败的消息进行重发