如何检测消息丢失

371 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情

前言

现在基本上主流的消息队列都提供了完善的消息可靠性保证机制,基本上可以保证在消息传递过程中不会丢失消息,即便是发生网络中断或者硬件故障。

关键在于了解消息队列是怎么保证消息可靠传递的,以及如何正确使用和配置消息队列才能避免消息丢失。

如何检测消息丢失

方案:利用消息队列的有序性来验证是否消息是否丢失,具体做法是在生产者端,给每个发出的消息增加一个属性,值为连续递增的序号,然后在消费者端检查这个序号的连续性。如果序号不连续,则说明消息有丢失,并且可以根据缺失的序号排查具体丢失的消息是什么。

例如Kafka或者RocketMQ之类的消息队列不会保证在指定Topic上的消息顺序,但是在Topic下指定的分区内是可以保证消息有序的,所以在使用Kafka或者RocketMQ之类的消息队列时,生产者发送消息时必须指定分区,不然无法保证消息是否连续。同时,最好是保证消费者的数量和分区数量是一致的,这样代码实现逻辑也相对简单一些。

另外,如果生产者是多实例部署,在添加连续序列的同时,还需要增加生产者标识,这样消费者可以根据不同的生产者来判断数据序号是否连续。

常见的消息队列都提供了拦截器机制,即在消息发送或者消息接收处理前,都可以对消息进行处理或者校验,我们可以利用这个机制,来实现注入序号到消息数据中,或者在消费者端是检测序号的连续性,这样做的好处是避免对业务代码产生侵入性。