RabbitMQ将消息重新发送给拒绝该消息的用户

时间:2018-07-02 10:37:17

标签: rabbitmq

我有一个队列和消息。我也有两个消费者在单独的过程中。我逐个接受消息,并确定此消息不是我的消息,并使用重排队标志拒绝它。在文档中,我找到了下一个短语“服务器不得在当前通道的上下文内将消息传递给相同的客户端”。这是否意味着应该将拒绝的邮件传递给其他使用者?

1 个答案:

答案 0 :(得分:0)

因此,我想谈谈几件事。

首先,您对RabbitMQ的行为提出疑问。上面引用的规则来自AMQP-0-9-1 specification。与大多数开放规范的实现一样,RabbitMQ也不完全合格。 This page准确,准确地详细说明了规范的哪些部分已实现,以及在何处出现偏差。

在该页面上,规定“未尝试阻止重新交付给同一客户端。” RabbitMQ在将来的版本中将其列为计划中的新增功能,但已经计划了好几年了。

消费者应该挑剔吗?

更重要的问题是您没有直接问过的问题,但这是“我的消费者是否应该对它处理的队列中的哪些消息挑剔?

答案是肯定的“否”。有关消息队列的主要设计假设之一是,订阅该队列的任何使用者都应能够处理该队列中的任何消息。因此,应该认为适当的设计是,连接到队列的所有使用者都运行相同的代码(相同的代码库,相同的版本)。如果没有,那么您的应用迟早会遇到一些严重的问题。

拒绝仅应用于告诉代理特定消息有问题。如果特定使用者有问题(例如失去与资料库的连接),则它不应拒绝该消息,而应关闭连接,从而触发重新交付给另一个正常使用的使用者。按照设计,需要由专门的或不同的使用者处理的消息应存放在不同的队列中。