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

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

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

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

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

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

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

阅读 6.5k
3 个回答

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题