假設有多個生產者發佈到同一個交換E(扇出)。每個製作人都有自己的頻道。隊列Q必須交換E.生產者P1將消息M1發佈給E並從E接收確認A1。只有在確認A1後,第二個生產者P2發佈第二個消息M2。 Q:M1中的RabbitMQ保證消息順序是第一位,M2是第二位?那是否會訂閱Q消費者總是收到M1,然後是M2?確認第一條消息後發送第二條消息。 RabbitMQ保證訂單嗎?
回答
RabbitMQ保證隊列中消息的順序:先進先出。進入隊列的第一條消息將成爲隊列中的第一條消息,並且它們將保持順序(假設你只是在消費和確認它們......如果你開始拒絕/拒絕消息,重新發布消息等等,事情會改變)
這是唯一的保證,它將在消息的順序:FIFO隊列。
如果您需要保證消息傳遞到隊列的順序,您必須自己構建該過程。
FWIW,這是很難建立這種保證。確保消息順序的唯一真正有保證的方法是在第一個消息處理完成之前不發送下一個消息。
即使您在發送下一個之前等待發布者確認,下一個可能會在第一個之前排隊(儘管極不可能)。
如果您需要保證客戶端以特定順序獲取消息,您可能需要查看Message Sequence和Resequencer。
謝謝。我明白你的回答是「不」。我們都同意「進入**隊列的第一條消息將成爲隊列中的第一條消息」。但我的問題是**交換和隊列**之間的距離。如果我理解正確,你說交換可以確認獲得消息M1給P1,接收消息M2,並以相反的順序將它們放入隊列中:M2,然後M1。正確? – Kaponir
這很可能不會發生,但仍然有可能。例如,M1可能非常大,需要寫入磁盤,而M2非常小,不需要寫入磁盤。或者,正在使用M1的erlang進程可能會崩潰並且必須重新啓動,從而使M2首先到達那裏。再次,不可能的情景,但可能的,仍然。 –
最終,如果您需要處理的保證順序,您可以使用順控程序並將隊列的處理一次限制爲1條消息,以便您可以正確地重新排列消息,如果它們出現故障 –
- 1. NServiceBus:發送第一條消息是慢
- 2. PrintWriter僅發送第一條消息
- 3. Microsoft.Owin.Hosting第一條消息
- 4. Facebook發送一條消息
- 5. 消息使用者在第一條消息後被阻止
- 6. TcpClient是單連接使用嗎?我如何發送第二條消息?
- 7. 消息隊列:每條消息保證
- 8. 當發送第二條消息時,mpi_send將被阻塞
- 9. 我怎麼能有RabbitMQ的運行只在第一條消息發送一次?
- 10. 我要發送第二消息,演員爲新的消息
- 11. Java:ObjectInputStream,發送3條消息,僅收到2條消息
- 12. Websocket4Net發送多條消息
- 13. MSMQ丟失的第一條消息
- 14. 從rabbitmq隊列中獲取一條消息並取消訂閱
- 15. Jboss消息。每次發送一條消息
- 16. Socket問題 - 只讀第一條消息
- 17. RabbitMQ:消息保持「未確認」
- 18. 根據第一條消息獲取最新的未讀消息
- 19. 只有第一條消息被髮送到服務器
- 20. 如何讓機器人發送第一條消息?
- 21. Java的TCP發送第一條消息,則無限等待
- 22. GAE頻道重複發送第一條消息
- 23. Akka演員在處理第一條消息之前正在處理第二條消息
- 24. 用PHP發送一條SOAP消息
- 25. 消費不確認消息來自RabbitMq
- 26. 消息只發送第一個字
- 27. 發送消息給Twitter創建一條錯誤消息
- 28. LuaSocket - TCP第2條消息沒有發送
- 29. 如何確保單一消息驅動的bean一次處理一條消息?
- 30. Make Hubot向HipChat發送一條消息
爲什麼你有多個生產者時,生產者(P2)總是等待先前的生產者(P1)得到ack? P1和P2如何交流? – cantSleepNow