2015-11-02 48 views
2

我在以下情況下使用RabbitMQ。當用戶使用高級搜索功能時,我通過RabbitMQ將消息發送到幾個服務器實例之一。他們運行相同的例程(數據庫查詢和計費)。我想確保我不會多次處理相同的消息。 我遇到過this great tutorial,但其中介紹的交換類型是「主題」,它不適用於我,因爲我多次處理相同的消息。
如何在RabbitMQ中使用工作隊列實現請求 - 響應模式,以便每條消息只處理一次,並且存在負載平衡?在RabbitMQ中帶有工作隊列的請求響應模式

+0

您無法通過RabbitMQ(或者其他任何分發的東西)獲得「準確一次交付」。這只是[不可能] [1]。 [1]:https://en.wikipedia.org/wiki/Two_Generals%27_Problem –

+0

實際問題是什麼,在這裏?你列出了一系列潛在的問題,但沒有提出一個問題。請修改帖子以提出具體問題。 –

回答

0

Anton Gogolev的上述評論是正確的。由於多種原因,您不能保證郵件只能處理一次。但是,這往往是系統的一個要求 - 只能產生一次所需的結果。

要做到這一點的方法是通過idempotence--即無論處理給定消息多少次,它只會進行一次所需的更改。

有很多方法可以做到這一點。一個簡單的例子是使用一個共享數據庫來跟蹤哪些消息已被處理。當你收到一條消息時,你會檢查它是否已經被處理。如果沒有,你會處理它。如果有的話,你可以忽略它並繼續前進。

在你的情況下,如果你正在做請求/響應並且想要負載均衡,你可能需要同一隊列中的多個使用者。您可以讓2或10或300個請求處理程序實例監聽同一個隊列,並且您不必擔心重複處理。

RabbitMQ會將給定的消息發送給單個消費者。它會等待消費者說它已經完成處理,或者如果消費者崩潰或拒絕該消息,它會將消息重新發送給另一個消費者再次嘗試。

這樣,每個請求通常只有一個請求處理程序。但多於一個人處理同樣的信息總是可能的,這就是爲什麼同性關係很重要。

關於使用話題交換與其他類型的交換 - 它沒有多大區別。總是有可能有多個隊列接收您發送的消息,因爲您可以使用相同的綁定鍵將多個隊列綁定到同一個交換機。

+0

所以有可能使用RPC作爲像工作模式一樣工作的許多「服務器」? https://www.rabbitmq.com/tutorials/tutorial-six-python.html – DOUBL3P

+0

在上面的鏈接中,他們寫道:「如果RPC服務器速度太慢,可以通過運行另一個擴展,嘗試運行第二個rpc_server .py在一個新的控制檯中。「所以RPC是一種只有響應纔有的Woker模式? – DOUBL3P

相關問題