今天咱们来聊聊消息队列中如何检测消息丢失以及相应的兜底方案。
上一期我们讲到了如何防止消息丢失,提到在生产、消费和存储这 3 个阶段都有保障措施,分别是生产阶段和消费阶段的 ack 确认,还有存储阶段的持久化策略。这些做起来相对容易,但即便如此,在分布式环境中,还是难免会出现消息丢失的情况。
作为消息的生产端,无法完全保证 MQ 不丢消息,也不能保证消费者能完全处理。所以本着“design for the failure”的设计原则,我们需要一种机制来检查消息是否丢失,并对丢失的消息做额外补偿,这就是常说的兜底方案。
可以利用拦截器机制,在生产端发送消息之前,通过拦截器将消息版本号设置好,版本号可以利用连续递增的 ID 生成,也可以通过分布式的全局 ID。消费端收到消息后,再通过拦截器把版本号记录下来,然后检测版本号的连续性来判断是否丢消息。如果丢了,就进行消息补偿。拦截器实现起来不难,常见的如 ADP 面向切面编程,它的好处是不用侵入到具体的业务代码中,契合度较低。
另外一个简单的方案,还是以消费送积分为例,定期去检查是否成功收到积分,如果没有变化,就采取相应措施。
感兴趣的小伙伴可以深入了解一下哦!