2015-09-16 28 views
1

我使用pika for python與RabbitMQ進行通信。我有6個線程,它們使用和確認來自同一隊列的消息。我爲每個線程使用不同的連接(和通道)。所以,我必須非常接近對方几個問題:RabbitMQ,重新連接後的交付標記值和消息順序

  1. 如果連接到兔子會在線程1結束,我會做出重新連接,交貨標籤值將重置並重新連接後,它會從0開始?

  2. 重新連接後,我會收到相同的未確認消息在每個線程相同的順序或它會開始再次分配他們之間的所有線程或它將從重新連接點開始?

在我的應用程序中這很重要,因爲消息接收和確認之間存在延遲,並且我希望避免在下一個處理步驟中出現重複。

回答

2
  1. 交貨標籤是通道特定的並且是服務器分配的。有關delivery-tag,請參閱AMQP spec, section 1.1. AMQP­defined DomainsRabbitMQ's documentation的詳細信息。爲delivery-tag RabbitMQ的初始值是1

    零被保留用於客戶端使用,意爲「所有消息到目前爲止接收到的」。

  2. 對於單個隊列中的多個消費者,不能保證消費者將按照他們排隊的順序獲得消息。見的RabbitMQ的Broker Semantics, "Message ordering guarantees" paragraph對於細節:

    的AMQP 0-9-1核心規範的第4.7節解釋根據該排序是有保證的條件:發表於一個信道的消息,通過一個交換和一個隊列和一個輸出信道將按照它們發送的相同順序收到。自2.7.0版本以來,RabbitMQ提供了更強大的保證。

    消息可以使用具有requeue參數(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