rabbitmq如何避免消息重复发送?
假如现在有三个角色:消息生产者、MQ、消息消费者
请问消息生产者 发送消息的机制 一般是怎么样的?是只发一遍就结束,不管有没有收到回馈;还是发送一遍,如果没有收到回馈,就会一直重试?
假如会一直重试。现在生产者往MQ投递了一个消息,但是由于网络原因或者MQ宕机了,导致生产者没有拿到回馈,然后不断地往MQ发送消息。请问这要怎么解决呢?假如因为这个原因导致 MQ出现消息堆积,又要怎么处理呢?
https://blog.csdn.net/jushisi...
我在网上找到一个参考,但是对于它的实现,并不是很了解,有大神知道相关的demo或者博文可以提供吗?
我知道上面提到的问题有点复杂,也不好回答。我愿意给出悬赏,算是感谢大神愿意解答。请大神指教,谢谢~
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
简单来说就是rabbitMQ是有
consumer ack
和producer ack
机制来保证消息发送成功的,参考文档:https://www.rabbitmq.com/conf...。虽然有
ack
机制,但也不是保证消息完全不会丢失的,因为rabbitmq的消息是会存储在内存中,再写入磁盘的,如果还没来得及写入磁盘,消息可能会丢失:https://www.rabbitmq.com/pers...。最后我们在消费消息的时候要做好幂等,一般来说消息队列的消息发送设计原则是
at least once
,所以存在重复发送的可能性。即使抛开MQ的实现机制来说,我们也应该做好幂等,毕竟你没法保证消息的发送方是怎么发消息的。不知有没有做过防重校验,根据贴出的博文和我的经验,给提供大概思路是,在消息发送方利用数据库生成一条防重复提交的id(数据类型自己定义),发送消息的时候一块儿发送给MQ,然后消费方取到消息的时候,先去校验防重复的id是否失效(消费过的防重复id,数据库作删除处理),未失效则消费,失效则不消费。
归根到底,是如何实现消费者的幂等性问题。唯一ID可以解决,注意并发时候的中间状态就行。将唯一ID缓存起来,消费的时候确认下是否消费过就行了。