RabbitMQ数据丢失分析
简要系统流程场景图
数据丢失场景
以下场景分析前提是队列持久化,交换器持久化,消息持久化,非持久化场景没有尝试。
消息发送
序号
Producer
MQ
数据丢失说明
1
发送数据失败
MQ服务宕机
Producer未做数据本地化导致数据丢失
2
发送数据成功
MQ服务良好
由于某种不良因素,MQ未收到消息,但Producer仍以为本身发送数据成功,导致数据丢失
消息持久化
在消息持久化的过程中,即写盘的过程中,MQ宕机导致的数据丢失,如下图。
消息消费
- 自动ack导致的数据丢失
- 业务处理异常导致的数据丢失
数据丢失解决方案
消息发送
- 发送失败后做数据本地化操作,待MQ正常后,将数据重新发往MQ。
- Producer开启Confirm模式,即MQ受到消息并持久化消息后会告诉Producer。
消息持久化
Producer开启Confirm模式,一旦没有受到MQ的回馈消息,重新发送,可以给个次数限制,不满足时还可以做数据本地化操作
消息消费
- 手动ack
- 解决代码异常,发生错误时,日志记录下数据。