RabbitMQ - 一个消费者是否阻止同一队列中的其他消费者?

时间:2013-07-24 18:19:31

标签: rabbitmq amqp

我正处于从RabbitMQ文档学习RabbitMQ / AMQP的阶段。我不清楚我想问那些有实践经验的人。 我想让多个消费者收听同一个队列,以平衡工作量。我需要的是非常接近"Work Queues" example in the RabbitMQ tutorial。 我希望消费者在完成处理消息后明确地确认消息,以保留消息并在发生崩溃时将消息委托给另一个消费者。处理消息可能需要一段时间。 我的问题是AMQP是否推迟下一个消息处理,直到上一个消息被激活?如果是这样,我如何在多个工作者之间实现负载平衡并保证没有消息丢失?

1 个答案:

答案 0 :(得分:8)

不,其他消费者不会受阻。即使他们有未被承认但已交付的前任,其他消息也将被传递。如果某个频道在保留未确认的消息时关闭,则这些消息将返回队列。

请参阅RabbitMQ Broker Semantics

  

可以使用AMQP方法将消息返回到队列,这些方法具有重新排队参数(basic.recover,basic.reject和basic.nack),或者由于在保留未确认消息时通道关闭。


编辑回复您的评论:

时间深入潜入AMQP specification然后或许:

  

3.1.4消息队列

     

消息队列是一个命名的FIFO缓冲区,它代表一组消费者应用程序保存消息。   应用程序可以在其权限范围内自由地创建,共享,使用和销毁消息队列。   请注意,如果存在来自队列的多个读取器,或客户端事务或使用优先级字段,   或使用消息选择器,或队列可能没有的特定于实现的传递优化   表现出真正的FIFO特性。保证FIFO的唯一方法是只连接一个消费者   到队列。在这些情况下,队列可以被描述为“弱FIFO”。 [...]

     

3.1.8致谢

     

确认是从客户端应用程序到其拥有的消息队列的正式信号   已成功处理了一条消息。[...]

因此确认确认处理,而不是收据。经纪人将保留该消息,直到它得到确认,以便它可以重新发送它们。但是,即使尚未确认预先存储的消息,也可以向消费者提供更多消息。消费者不会受阻。