为什么在重新排队时从RabbitMQ收到相同的消息?

为什么在重新排队时从RabbitMQ收到相同的消息?,rabbitmq,amqp,Rabbitmq,Amqp,背景 我的队列中有两条消息: 福 酒吧 我有一个通道,一个Qos活动的消费者,预取计数为1 场景 消息传递foo进入,我拒绝带有requeue=true的消息 预期: 传递的下一条消息是bar 实际: 传递的下一条消息是foo 问题: 为什么我的消费者收到的信息是它刚刚重新发出的,而不是下一条?我怎样才能得到上面描述的结果 我希望重新排队的消息位于队列的末尾 我已经考虑过确认并重新发布邮件,但这会增加邮件丢失的风险。来自 可以使用具有以下特性的AMQP方法将消息返回到队列: requeue参

背景

我的队列中有两条消息:

  • 酒吧
我有一个通道,一个Qos活动的消费者,预取计数为1

场景

消息传递
foo
进入,我拒绝带有
requeue=true
的消息

预期: 传递的下一条消息是
bar

实际: 传递的下一条消息是
foo

问题:

为什么我的消费者收到的信息是它刚刚重新发出的,而不是下一条?我怎样才能得到上面描述的结果

我希望重新排队的消息位于队列的末尾

我已经考虑过确认并重新发布邮件,但这会增加邮件丢失的风险。

来自

可以使用具有以下特性的AMQP方法将消息返回到队列: requeue参数(basic.recover、basic.reject和basic.nack),或由于在保存未确认消息时通道关闭。这些都有吗 场景导致消息在队列的后面重新排队,以便 RabbitMQ版本早于2.7.0。从RabbitMQ 2.7.0版, 消息始终按发布顺序保存在队列中,即使在 出现重新排队或通道关闭

重点矿山

因为您只有一个消费者,所以这种行为是意料之中的

您可以将消息重新发布到同一队列, 这将确保问题消息最终出现在尾部

您的另一个选项是为失败消息创建一个新队列,以便
请分别处理。

谢谢您指出这一点。我以前没有找到那个文档页面。你对如何以我想要的方式使用消息有什么建议吗?嗯,我认为你唯一的选择是重新发布到同一队列。您的另一个选择是为失败的消息创建一个新队列,然后分别处理它们?恐怕是这样。我会做一些测试,看看它有多可靠。再次感谢!当您将消息发布到队列(相同或其他)时,它是可靠的,除非您遇到应用程序或rabbitmq服务器的灾难性故障。