RabbitMQ将消息重新传递给拒绝该消息的同一消费者

RabbitMQ将消息重新传递给拒绝该消息的同一消费者,rabbitmq,Rabbitmq,我有一个队列和消息。此外,我有两个消费者在单独的过程。我一个接一个地接收消息,并确定此消息不是我的,然后使用requeue标志拒绝它。在文档中,我发现了下一个短语“服务器不得在当前通道的上下文中向同一客户机传递消息”。这是否意味着被拒绝的信息应该传递给另一个消费者?因此,这里有几件事我想谈谈 首先,你的问题是关于兔子的行为。上面引用的规则来自。与大多数开放规范的实现一样,RabbitMQ并不完全符合规范。准确详细地描述了实施规范的哪些部分,以及出现任何偏差的地方 在该页面上,它规定“不会试图阻止

我有一个队列和消息。此外,我有两个消费者在单独的过程。我一个接一个地接收消息,并确定此消息不是我的,然后使用requeue标志拒绝它。在文档中,我发现了下一个短语“服务器不得在当前通道的上下文中向同一客户机传递消息”。这是否意味着被拒绝的信息应该传递给另一个消费者?

因此,这里有几件事我想谈谈

首先,你的问题是关于兔子的行为。上面引用的规则来自。与大多数开放规范的实现一样,RabbitMQ并不完全符合规范。准确详细地描述了实施规范的哪些部分,以及出现任何偏差的地方

在该页面上,它规定“不会试图阻止重新交付给同一客户机。”RabbitMQ将此列为未来版本中计划添加的内容,但这已经计划了好几年了

消费者应该挑剔吗?

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

答案是肯定的“否”。关于消息队列的一个关键设计假设是,订阅该队列的任何使用者都应该能够处理队列中的任何消息。因此,连接到队列的所有使用者都运行相同的代码(相同的代码基,相同的版本)应该被视为正确的设计。否则,您的应用程序迟早会出现一些严重问题


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

您是否确实尝试过此操作以了解其行为?是的。我尝试过,我有两次尝试一个应用程序使用不同配置的实例来消费不同的消息,通过设计,一个实例上不满足某些条件的消息应该被另一个实例拒绝并处理。但这是行不通的。消费者的“不挑剔”似乎是一个非常严格的约束。这实际上意味着我不能这是一种应用程序设计,只有消费者知道它是否能够处理某种类型的消息,从而有效地迫使发布者知道这一点并相应地对消息进行分类。此外,您的建议意味着我们甚至不应该使用相关id来确定消息是否是针对我们的(因为这只是基于消息的挑剔的一个例子)。这不是有点极端吗?@Martin,在这种情况下,你会使用主题交换。谢谢@theMayer,这确实是我过去所追求的,但它并不适合我的问题。我很好奇你对相关id问题的看法。当然,如果我们按照RMQ文档中的建议使用共享回复队列,那么我们必须区分是哪个呃,一条消息是给我们的,然后你肯定不希望RMQ用你拒绝的消息向你发送垃圾邮件。我不知道共享回复队列是一种建议的方法。我通常用自己的唯一回复队列设置我的发布者,这样,发送回该发布者的任何消息都将进入唯一队列。请详细说明我对叶的评论今天,所有的发布者都知道他们发布的是什么类型的消息。如果消息的某些特征使某些消费者无法处理,那么你就有了不同类型的消息。相反,如果某些消费者无法处理带有特定数据的消息,那么这些消费者需要重新编程,以便他们能够处理。我不能想象一下,在一个设计合理的体系结构中,如果假定两个使用者都能够使用相同的消息类型,那么相同的消息类型可能在一个使用者上成功,而在另一个使用者上失败。