rabbitmq如何避免消息重复发送?

发布于 2022-09-30 23:09:27 字数 915 浏览 30 评论 0

假如现在有三个角色:消息生产者、MQ、消息消费者

请问消息生产者 发送消息的机制 一般是怎么样的?是只发一遍就结束,不管有没有收到回馈;还是发送一遍,如果没有收到回馈,就会一直重试?

假如会一直重试。现在生产者往MQ投递了一个消息,但是由于网络原因或者MQ宕机了,导致生产者没有拿到回馈,然后不断地往MQ发送消息。请问这要怎么解决呢?假如因为这个原因导致 MQ出现消息堆积,又要怎么处理呢?

https://blog.csdn.net/jushisi...

我在网上找到一个参考,但是对于它的实现,并不是很了解,有大神知道相关的demo或者博文可以提供吗?

我知道上面提到的问题有点复杂,也不好回答。我愿意给出悬赏,算是感谢大神愿意解答。请大神指教,谢谢~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

爱殇璃 2022-10-07 23:09:27

简单来说就是rabbitMQ是有consumer ackproducer ack机制来保证消息发送成功的,参考文档:https://www.rabbitmq.com/conf...

虽然有ack机制,但也不是保证消息完全不会丢失的,因为rabbitmq的消息是会存储在内存中,再写入磁盘的,如果还没来得及写入磁盘,消息可能会丢失:https://www.rabbitmq.com/pers...

最后我们在消费消息的时候要做好幂等,一般来说消息队列的消息发送设计原则是at least once,所以存在重复发送的可能性。即使抛开MQ的实现机制来说,我们也应该做好幂等,毕竟你没法保证消息的发送方是怎么发消息的。

山人契 2022-10-07 23:09:27

不知有没有做过防重校验,根据贴出的博文和我的经验,给提供大概思路是,在消息发送方利用数据库生成一条防重复提交的id(数据类型自己定义),发送消息的时候一块儿发送给MQ,然后消费方取到消息的时候,先去校验防重复的id是否失效(消费过的防重复id,数据库作删除处理),未失效则消费,失效则不消费。

虐人心 2022-10-07 23:09:27

归根到底,是如何实现消费者的幂等性问题。唯一ID可以解决,注意并发时候的中间状态就行。将唯一ID缓存起来,消费的时候确认下是否消费过就行了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文