假如现在有三个角色:消息生产者、MQ、消息消费者
请问消息生产者 发送消息的机制 一般是怎么样的?是只发一遍就结束,不管有没有收到回馈;还是发送一遍,如果没有收到回馈,就会一直重试?
假如会一直重试。现在生产者往MQ投递了一个消息,但是由于网络原因或者MQ宕机了,导致生产者没有拿到回馈,然后不断地往MQ发送消息。请问这要怎么解决呢?假如因为这个原因导致 MQ出现消息堆积,又要怎么处理呢?
https://blog.csdn.net/jushisi...
我在网上找到一个参考,但是对于它的实现,并不是很了解,有大神知道相关的demo或者博文可以提供吗?
我知道上面提到的问题有点复杂,也不好回答。我愿意给出悬赏,算是感谢大神愿意解答。请大神指教,谢谢~
简单来说就是rabbitMQ是有
consumer ack
和producer ack
机制来保证消息发送成功的,参考文档:https://www.rabbitmq.com/conf...。虽然有
ack
机制,但也不是保证消息完全不会丢失的,因为rabbitmq的消息是会存储在内存中,再写入磁盘的,如果还没来得及写入磁盘,消息可能会丢失:https://www.rabbitmq.com/pers...。最后我们在消费消息的时候要做好幂等,一般来说消息队列的消息发送设计原则是
at least once
,所以存在重复发送的可能性。即使抛开MQ的实现机制来说,我们也应该做好幂等,毕竟你没法保证消息的发送方是怎么发消息的。