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

时间:2015-09-16 13:48:49

标签: python rabbitmq pika

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

  1. 如果与兔子的连接将在1个线程中关闭,我将重新连接,传递标签值将重置,重新连接后它将从0开始?

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

  3. 在我的应用程序中这很重要,因为消息接收和确认之间存在延迟,我希望避免在下一个处理步骤中重复。

1 个答案:

答案 0 :(得分:2)

  1. 传递标记是特定于通道的,并且是服务器分配的。有关x的详情,请参阅AMQP spec, section 1.1. AMQP­defined DomainsRabbitMQ's documentation 。 Rabbit {delivery-tag的初始值为delivery-tag

      

    为客户使用保留零,意味着“到目前为止收到的所有消息”。

  2. 如果单个队列中有多个使用者,则无法保证使用者将按照排队的相同顺序获取邮件。有关详细信息,请参阅RabbitMQ的Broker Semantics, "Message ordering guarantees" paragraph

      

    AMQP 0-9-1核心规范的第4.7节解释了保证订购的条件:在一个信道中发布的消息,通过一个交换机,一个队列和一个输出信道将以与它们相同的顺序接收被送了。自2.7.0发布以来,RabbitMQ提供了更强大的保证。

         

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

         

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

    另请参阅this answer for "RabbitMQ - Message order of delivery" question