RabbitMQ-是否一个使用者阻塞同一队列的其他使用者



我正处于从RabbitMQ文档学习RabbitMQ/AMQP的阶段。我不清楚的是,我想问那些有实际经验的人。为了平衡工作负载,我想让多个消费者监听同一个队列。我需要的非常接近RabbitMQ教程中的"工作队列"示例。我希望使用者在处理完消息后明确确认消息,以保留消息,并在崩溃时将其委托给另一个使用者。处理消息可能需要一段时间。我的问题是,AMQP是否会推迟下一条消息的处理,直到上一条消息得到确认?如果是,我如何在多个工作人员之间实现负载平衡并保证不会丢失消息?

不,其他消费者不会被阻止。其他消息将被传递,即使它们有未确认但已传递的前置消息。如果通道在保存未确认的消息时关闭,则这些消息将返回到队列。

请参阅RabbitMQ Broker语义

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


编辑回应您的评论:

是时候更深入地研究AMQP规范了,也许是:

3.1.4消息队列

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

3.1.8确认

确认是客户端应用程序向消息队列发出的正式信号成功处理了一条消息。[…]

所以确认确认处理,而不是接收。经纪人将保留该消息,直到它得到确认,这样它就可以重新传递它们。但它可以免费向消费者传递更多信息,即使预先确定的信息尚未得到确认。消费者不会被阻止。

相关内容

最新更新