这里我们以RocketMQ为例子,其他消息队列的原理基本上差不多。
首先确定在消息的传输过程中,会在三个阶段出现丢失数据的情况:
- 生产者没有成功发送消息
- RocketMQ没有成功持久化消息
- 消费者没有成功消费消息
对应的解决办法也非常地简单,和TCP的三次握手很类似:
- 事务机制/confirm机制:
生产者开启事务,只有当RocketMQ成功收到消息了,生产者才关闭事务,但是这个方法会阻塞;confirm机制相对有优势,它属于异步操作,当生产者发送完消息后,不需要一直等待,RocketMQ接收后会通知到生产者。 - 开启持久化: RocketMQ开启持久化,只有在RocketMQ成功持久化之后,才会发送confirm的消息给生产者
- 关闭RocketMQ的自动ack, 消费者只有消费完毕后才给RocketMQ发送确认消息