9

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

4

1 回答 1

12

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

请参阅RabbitMQ 代理语义

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


编辑回应您的评论:

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

3.1.4 消息队列

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

3.1.8 致谢

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

所以确认确认处理,而不是收据。代理将保留该消息,直到它得到确认,以便它可以重新传递它们。但是,即使之前的消息尚未被确认,也可以自由地向消费者传递更多消息。消费者不会被阻止。

于 2013-07-24T18:35:39.000 回答