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