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

时间:2016-03-24 09:55:32

标签: rabbitmq amqp

背景

我的队列中有两条消息:

  • FOO

我有一个频道,一个Qos处于活跃状态且预取计数为1的消费者。

方案

邮件传递foo进来,我拒绝了requeue=true邮件。

预期: 下一封邮件是bar

实际值: 下一封邮件是foo

问题:

为什么我的消费者会收到刚刚重新排队的消息而不是下一封消息呢?我怎样才能得到上述结果?

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

我已经考虑过确认并重新发布该消息,但这会导致丢失消息的风险。

1 个答案:

答案 0 :(得分:4)

来自https://www.rabbitmq.com/semantics.html

  

可以使用具有a的AMQP方法将消息返回到队列   requeue参数(basic.recover,basic.reject和basic.nack),或者由于>一个频道在收到未确认的消息时关闭。任何这些   场景导致消息在队列后面重新排队   RabbitMQ早于2.7.0发布。来自RabbitMQ 2.7.0版,   消息始终以发布顺序保存在队列中,即使在   存在重新排队或通道关闭

强调我的

因为您只有一个消费者,所以这种行为是预期的

您可以将邮件重新发布到同一个队列, 这将确保问题消息最终落在尾部。

您的另一个选择是为失败的消息创建新队列,这样您就可以 单独处理它们。