2016-02-28 58 views
5

假設有多個生產者發佈到同一個交換E(扇出)。每個製作人都有自己的頻道。隊列Q必須交換E.生產者P1將消息M1發佈給E並從E接收確認A1。只有在確認A1後,第二個生產者P2發佈第二個消息M2。 Q:M1中的RabbitMQ保證消息順序是第一位,M2是第二位?那是否會訂閱Q消費者總是收到M1,然後是M2?確認第一條消息後發送第二條消息。 RabbitMQ保證訂單嗎?

+0

爲什麼你有多個生產者時,生產者(P2)總是等待先前的生產者(P1)得到ack? P1和P2如何交流? – cantSleepNow

回答

1

RabbitMQ保證隊列中消息的順序:先進先出。進入隊列的第一條消息將成爲隊列中的第一條消息,並且它們將保持順序(假設你只是在消費和確認它們......如果你開始拒絕/拒絕消息,重新發布消息等等,事情會改變)

這是唯一的保證,它將在消息的順序:FIFO隊列。

如果您需要保證消息傳遞到隊列的順序,您必須自己構建該過程。

FWIW,這是很難建立這種保證。確保消息順序的唯一真正有保證的方法是在第一個消息處理完成之前不發送下一個消息。

即使您在發送下一個之前等待發布者確認,下一個可能會在第一個之前排隊(儘管極不可能)。

如果您需要保證客戶端以特定順序獲取消息,您可能需要查看Message SequenceResequencer

+0

謝謝。我明白你的回答是「不」。我們都同意「進入**隊列的第一條消息將成爲隊列中的第一條消息」。但我的問題是**交換和隊列**之間的距離。如果我理解正確,你說交換可以確認獲得消息M1給P1,接收消息M2,並以相反的順序將它們放入隊列中:M2,然後M1。正確? – Kaponir

+0

這很可能不會發生,但仍然有可能。例如,M1可能非常大,需要寫入磁盤,而M2非常小,不需要寫入磁盤。或者,正在使用M1的erlang進程可能會崩潰並且必須重新啓動,從而使M2首先到達那裏。再次,不可能的情景,但可能的,仍然。 –

+0

最終,如果您需要處理的保證順序,您可以使用順控程序並將隊列的處理一次限制爲1條消息,以便您可以正確地重新排列消息,如果它們出現故障 –