RabbitMQ,重新连接后的传递标签值和消息顺序

Kir*_*nov 3 python rabbitmq pika

我使用 pika for python 与 RabbitMQ 进行通信。我有 6 个线程,它们使用和确认来自同一队列的消息。我为每个线程使用不同的连接(和通道)。所以我有几个非常接近的问题:

  1. 如果与 rabbit 的连接将在线程的 1 中关闭,并且我将进行重新连接,则交付标记值将重置,重新连接后它将从 0 开始?

  2. 重新连接后,我将为每个线程以相同的顺序收到相同的未确认消息,或者它会在所有线程之间再次开始分发它们还是从重新连接点开始?

这在我的应用程序中很重要,因为消息接收和确认之间存在延迟,我想避免在接下来的流程步骤中重复。

pin*_*ain 5

  1. 交付标签是特定于渠道和服务器分配的。请参阅AMQP 规范第 1.1 节中的详细信息AMQPdefined域RabbitMQ的文档进行delivery-tag。的RabbitMQ初始值delivery-tag1

    零保留供客户端使用,意思是“到目前为止收到的所有消息”。

  2. 在单个队列上有多个消费者时,不能保证消费者会按照他们排队的相同顺序获得消息。有关详细信息请参阅 RabbitMQ 的Broker Semantics,“消息排序保证”段落

    AMQP 0-9-1 核心规范的第 4.7 节解释了保证排序的条件:在一个通道中发布的消息,通过一个交换,一个队列和一个传出通道将按照与发送相同的顺序接收。RabbitMQ 自 2.7.0 版起提供了更强的保证。

    消息可以使用具有重新排队参数(basic.recover、basic.reject 和 basic.nack)的 AMQP 方法返回到队列,或者由于通道关闭而保留未确认的消息。对于早于 2.7.0 的 RabbitMQ 版本,这些场景中的任何一个都会导致消息在队列的后面重新排队。从 RabbitMQ 2.7.0 版开始,消息总是按发布顺序保存在队列中,即使存在重新排队或通道关闭的情况。

    在 2.7.0 及更高版本中,如果队列有多个订阅者,单个消费者仍然可以无序地观察消息。这是由于可能重新排队消息的其他订阅者的操作。从队列的角度来看,消息始终按发布顺序保存。

    另外,请参阅“RabbitMQ - Message order of delivery”问题的答案