2011-03-09 41 views
3

相當新的RabbitMQ的,我們現在還處於調查階段,看它是否是一個很好的適合我們使用cases--RabbitMQ的扇出

我們很容易得出這樣的結論,我們的所需的拓撲將使我們部署幾個基於主題的交換,然後從那裏過濾到特定的隊列。例如,假設我們有一個用戶和一個上傳交換,其中用戶隊列可能接收主題爲「新註冊」或「朋友請求」的消息,並且上傳交換可能會接收諸如「視頻上傳」或「圖片上傳」。

創建隊列,讓他們路由到適當的隊列,然後建立偵聽器來處理消息的各種隊列已經相當直截了當。

什麼我不清楚但是是是否有可能做一個主題交換扇出?

I.e.我已經命名了與我的主題交換綁定的隊列,但是我希望能夠將這些隊列中的噸監聽器實例放在這些隊列中,以防止發生單點故障。但據我所知,RabbitMQ以一種簡單的循環方式對待這些聽衆 - 例如,每一個第N條消息總是到達相同的第N個監聽器,而不是將消息分派給第一個可用的使用者。這通常是我們可以接受的,但考慮到我們預期的負荷,我們希望避免在我們的消費農場中發現熱點的可能性。

所以,有一些方法,無論是在隊列或交換配置中的消費代碼,在這裏我們可以指出我們的聽衆一個主題隊列但在扇出的方式對待聽衆?

回答

0

,我不知道一個事實,但我強烈懷疑的RabbitMQ將跳過消費者未確認的消息,所以它不應該在一個單一卡消費的瓶頸。對其FAQ的評論似乎表明RabbitMQ將努力保持事情的持續性,即使在麻煩的消費者面前。

5

是的,通過讓偵聽器使用不同的隊列名稱進行綁定,它們將以扇形方式進行處理。

扇出是1:N雖然,即,每個任務可以被遞送到多個偵聽像發佈 - 訂閱。請注意,這不僅限於扇出交換,還適用於使用相同綁定密鑰將多個隊列綁定到直接交換或主題交換的情況。 (安裝管理插件,並在尋找的交流有可能會在可視化效果綁定有用。)

您當前的設置是一個任務隊列。每個任務/消息只傳遞給一個工作人員/聽衆。以相同的隊列名稱引發更多的偵聽器,並按照您的說法循環處理任務。使用「扇出」(針對某個主題的單獨隊列),您將多次處理任務。

根據您的平臺,可能存在符合您需求的現有工作隊列解決方案,例如Ruby的Resque或DelayedJob,Python的Celery或JVM的Octobot或Akka。

0

這是一個遲到的答案,但萬一別人遇到這個問題... 這聽起來像你想要的是公平派遣,而不是一個扇出模型(它將發佈給每個隊列的給定消息)。

公平調度將給下一個可用的工作者發送消息,而不是使用簡單的循環法。這應該避免你關心的「熱點」,而不會向多個消費者傳遞相同的消息。

如果這是您正在尋找的內容,請參閱Rabbit文檔中關於this page的「Fair Dispatch」部分。 A prefetch計數爲1是這裏的關鍵。