RabbitMQ 怎么保证消息不被重复消费以及消息的可靠性
🍁 作者:知识浅谈,CSDN 博客专家,阿里云签约博主,InfoQ 签约博主,华为云云享专家
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
RabbitMQ 怎么保证消息不被重复消费以及消息的可靠性总结🤞这次都给他拿下🤞
正菜来了⛳⛳⛳
🎈RabbitMQ 怎么保证消息不被重复消费
1️⃣:消息队列发送 ACK 消息到生产者过程出现的问题开启 ACK 确认机制后,发送方发送消息之后,消息队列发送 ACK 确认的时候,如果由于网络波动造成 ACK 消息丢失,发送方重复发送造成的消息重复。
解决方法:使用定时任务+Redis,发送之后如果没有收到 ACK,定时重发,在消息队列处,使用 redis 记录收到的消息,如果收到 redis 存在的消息,说明之前已经收到过,便直接返回 ACK。
2️⃣:消费者发送 ACK 消息到消息队列的过程中出现的问题消息队列发送消息到消费者之后,消费之后,消费者返回 ACK 给消息队列,如果 ACK 由于网络的问题没有收到,消息队列会再次发送消息给消费者,如果此前已经消费过该消息,则为了防止消息的重复消费,保证幂等性,有两种解决方案。
消息中携带全局唯一的 id,当消息重复发送时,检查该全局唯一 id 是否存在于数据库中。
使用 redis 记录已经消费的消息,当消息消费之后使用 redis 记录,当重复消费的时候直接返回 ACK 即可。
🎈RabbitMQ 怎么保证消息的可靠性
🍮消息的持久化保证
消息队列开启消息的持久化机制 channel.queueDeclare("queue.persistent.name", true, false, false, null);第二个参数 true,表示 durable=true;
🍮ACK 确认机制保证
发送者发送消息之后,消息队列发送 ACK 确认。
消息队列发送消息之后,消费者发送 ACK 确认。
🍮开启消息重试机制
当消息发送之后没有被正常消费,发送方在一定的事件后重发消息,因为有可能上一次发送的时候,由于网络波动,发送失败。
🍮开启死信队列
当重复消息发送之后仍不能正常消费,把消息发送到死信队列,对于消费失败的消息进行人工干预。
🍚总结
以上就是关于个人对 RabbitMQ 怎么保证消息不被重复消费以及消息的可靠性的浅见,如有问题,请指正学习,希望有所帮助。
版权声明: 本文为 InfoQ 作者【知识浅谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/bb7b9439d2da1453c7da3ad10】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论