怎么保证消息的不丢失
怎么保证消息的不丢失
原因
-
消息生产者没有成功发送到MQ Broker
-
消息发送给MQ Broker后,Broker 宕机后导致内存中的消息数据丢失
-
消费者获取到消息,但消费者还没有来得及处理宕机了,但此时MQ中的消息已经删除,消费者重启后不能再消费之前的消息
解决思路
- 消息发送者发送给MQ Broker后,MQ Broker给生产者确认收到。
- confirm模式用的居多:一旦channel进入confirm模式,所有在该信道上发布的消息都将会被指派一个唯一的ID(从1开始),当消息都被投递到队列后,MQ会发送一个ACK给生产者,如果没有处理消息,则会发送Nack。
- MQ收到消息后进行消费持久化
- 将queue的持久化标识durable设置为true,代表持久的队列
- 发送消息的时候将deliveryMode=2(即消息的持久化)
- 消费者收到消息处理后手动进行ack确认
- 将autoAck设置为false
- MQ收到消费者ack确认后删除持久化消息