我在以下情況下使用RabbitMQ。當用戶使用高級搜索功能時,我通過RabbitMQ將消息發送到幾個服務器實例之一。他們運行相同的例程(數據庫查詢和計費)。我想確保我不會多次處理相同的消息。 我遇到過this great tutorial,但其中介紹的交換類型是「主題」,它不適用於我,因爲我多次處理相同的消息。
如何在RabbitMQ中使用工作隊列實現請求 - 響應模式,以便每條消息只處理一次,並且存在負載平衡?在RabbitMQ中帶有工作隊列的請求響應模式
2
A
回答
0
Anton Gogolev的上述評論是正確的。由於多種原因,您不能保證郵件只能處理一次。但是,這往往是系統的一個要求 - 只能產生一次所需的結果。
要做到這一點的方法是通過idempotence--即無論處理給定消息多少次,它只會進行一次所需的更改。
有很多方法可以做到這一點。一個簡單的例子是使用一個共享數據庫來跟蹤哪些消息已被處理。當你收到一條消息時,你會檢查它是否已經被處理。如果沒有,你會處理它。如果有的話,你可以忽略它並繼續前進。
在你的情況下,如果你正在做請求/響應並且想要負載均衡,你可能需要同一隊列中的多個使用者。您可以讓2或10或300個請求處理程序實例監聽同一個隊列,並且您不必擔心重複處理。
RabbitMQ會將給定的消息發送給單個消費者。它會等待消費者說它已經完成處理,或者如果消費者崩潰或拒絕該消息,它會將消息重新發送給另一個消費者再次嘗試。
這樣,每個請求通常只有一個請求處理程序。但多於一個人處理同樣的信息總是可能的,這就是爲什麼同性關係很重要。
關於使用話題交換與其他類型的交換 - 它沒有多大區別。總是有可能有多個隊列接收您發送的消息,因爲您可以使用相同的綁定鍵將多個隊列綁定到同一個交換機。
相關問題
- 1. RabbitMQ RPC是一種帶有響應的「工作隊列」嗎?
- 2. 在RabbitMQ工作隊列中返回NACK請求
- 3. 使用芹菜/ RabbitMQ的(隊列)擊中Django的請求/響應週期
- 4. 在EasyNetQ中聲明具有特定名稱的請求/響應模式的響應隊列
- 5. RabbitMQ請求 - 響應模式 - 消費者在處理第一條消息後停止監聽隊列
- 6. 如何在請求/響應模式下使用Azure存儲隊列?
- 7. 請求 - 響應模式不能與EM-zeromq工作
- 8. AWS SQS異步排隊模式(請求/響應)
- 9. 使用異步隊列連接http請求/響應模型
- 10. 請求 - 響應模式的JMS
- 11. 使用Azure Java SDK製作請求響應隊列
- 12. zeromq請求/響應示例顯示在Python中使用隊列?
- 13. 排球請求隊列中的響應順序是什麼?
- 14. 請求響應模式及其用法
- 15. 帶WCF和持久隊列的RabbitMQ
- 16. RabbitMQ請求/響應有效負載結構
- 17. HTTP工具請求/響應
- 18. 在MySQL回調中響應服務器響應的請求響應不按預期方式工作? nodejs
- 19. 請求隊列()請求隊列中,不能appied
- 20. 帶出HTTP請求的HTTP響應
- 21. 請求回覆範圍與請求響應交換模式
- 22. 請求 - 響應與雙工WCF消息交換模式
- 23. RabbitMQ - 許多隊列還是帶路由密鑰的隊列?
- 24. 清理隊列中所有其他請求的GCD隊列
- 25. RabbitMq - >已確認工作已完成的分佈式工作隊列
- 26. WCF中的請求和響應範式
- 27. C#請求隊列
- 28. 在消費者中啓動請求/響應模式
- 29. RabbitMQ - parellel隊列
- 30. nodejs-請求模塊 - 將請求中的多個響應流式傳輸到http.ServerResponse
您無法通過RabbitMQ(或者其他任何分發的東西)獲得「準確一次交付」。這只是[不可能] [1]。 [1]:https://en.wikipedia.org/wiki/Two_Generals%27_Problem –
實際問題是什麼,在這裏?你列出了一系列潛在的問題,但沒有提出一個問題。請修改帖子以提出具體問題。 –