Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RabbitMQ-一个使用者是否阻止同一队列的其他使用者?_Rabbitmq_Amqp - Fatal编程技术网

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

RabbitMQ-一个使用者是否阻止同一队列的其他使用者?,rabbitmq,amqp,Rabbitmq,Amqp,我正处于从RabbitMQ文档学习RabbitMQ/AMQP的阶段。有些事情我不清楚,我想问那些有实际经验的人。 我想让多个消费者监听同一个队列,以平衡工作负载。我需要的是非常接近的。 我希望消费者在处理完消息后明确确认消息,以保留消息,并在崩溃时将其委托给另一个消费者。处理消息可能需要一段时间。 我的问题是AMQP是否会推迟下一条消息的处理,直到上一条消息被确认?如果是这样的话,我如何在多个工作者之间实现负载平衡并保证没有消息丢失 不,其他消费者不会被阻止。其他消息将被传递,即使它们有未确认但

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

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

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


根据您的评论进行编辑:

是时候深入一点了,也许:

3.1.4消息队列

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

3.1.8致谢

确认是从客户机应用程序到它所拥有的消息队列的正式信号 已成功处理邮件。[…]


因此,确认确认处理,而不是接收。代理将保留消息,直到消息被确认,以便重新传递它们。但它可以免费向消费者发送更多信息,即使之前的信息尚未得到确认。消费者不会被阻止。

谢谢。事实上,我在文档中的任何地方都找不到第一部分的答案(“不,其他消费者不会被阻止”)。这正是我想要的行为。另一方面,它打破了队列语义,不是吗?这些消息可能被无序处理。请编辑答案。是的,这些信息可能是由消费者处理的。感谢您添加关于FIFO的澄清。彻底而清晰的回答。@flup如果未确认的消息得到nack或reject,它会去哪里?在队列的顶部或底部?@guiomie,这是特定于实现的。比如:[…]对于2.7.0之前的RabbitMQ版本,这些场景中的任何一种都会导致消息在队列后面重新排队。从RabbitMQ 2.7.0版开始,消息始终按发布顺序保存在队列中,即使存在重新排队或通道关闭的情况。