博客 RabbitMQ如何避免消息重复投递或重复消费?

RabbitMQ如何避免消息重复投递或重复消费?

   数栈君   发表于 2024-11-18 14:50  721  0

RabbitMQ通过一系列机制来避免消息的重复投递和重复消费,确保消息的可靠传输和处理。

1.消息去重:

在发送端去重:在发送消息之前,可以在消息的唯一标识字段上进行去重操作。使用数据库或缓存来记录已经发送的消息的标识,每次发送消息之前先查询是否已存在相同标识的消息,如果存在则不发送。这样可以避免消息的重复发送。

使用去重插件:RabbitMQ提供了一些去重插件,如rabbitmq-deduplication插件。这些插件可以在消息发送时自动进行去重操作,根据消息的内容生成唯一的消息ID,并在发送之前检查是否已存在相同ID的消息,从而避免重复发送。


2.消息确认机制:

消费者确认:消费者在处理完消息后,可以发送确认消息给RabbitMQ,告知消息已经被正确处理。RabbitMQ收到确认消息后,会将该消息从队列中删除,避免消息的重复消费。

confirm(发布确认)机制:RabbitMQ支持开启confirm模式,生产者每次发送消息都会分配一个唯一的ID。当RabbitMQ成功接收到消息后,会异步回调生产者的接口返回成功与否的消息。如果消息处理失败,RabbitMQ会回调生产者的nack接口,通知消息接收失败,生产者可以重新发送。这样结合内存维护消息ID状态,可以重发丢失的消息。

3.使用全局唯一标识:

消息全局ID或唯一标识:每次消费消息之前,根据消息ID去判断该消息是否已消费过。如果已经消费过,则不处理这条消息;否则正常消费,并进行入库操作。

利用Redis的setnx命令:给消息分配一个全局ID,消费消息时,先去Redis中查询是否有消费记录。如果没有,则以键值对形式写入Redis;如果有,则不消费该消息。

持久化:

开启RabbitMQ的持久化:确保队列和消息都被持久化到磁盘上,以防止在RabbitMQ重启或故障时丢失消息。

合理设计消费者逻辑:

确保消费者在处理消息时具有幂等性

多次执行相同的操作不会产生不同的结果,以避免重复消费导致的副作用。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_45286894/article/details/141460608



本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!

《数据资产管理白皮书》下载地址:https://www.dtstack.com/resources/1073/?src=bbs

《行业指标体系白皮书》下载地址:https://www.dtstack.com/resources/1057/?src=bbs
《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001/?src=bbs
《数栈V6.0产品白皮书》下载地址:https://www.dtstack.com/resources/1004/?src=bbs

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=bbs

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术群」,交流最新开源技术信息,群号码:30537511,项目地址:https://github.com/DTStack

0条评论
社区公告
  • 大数据领域最专业的产品&技术交流社区,专注于探讨与分享大数据领域有趣又火热的信息,专业又专注的数据人园地

最新活动更多
微信扫码获取数字化转型资料
钉钉扫码加入技术交流群