2016-11-26 143 views
0

我知道AMQP並嘗試爲RabbitMQ系統制定通知體系結構。RabbitMQ - 主題交換 - 同一主題的兩個或更多的消費者

我想要一個Topic交換(NotificationsExchange,我們假設),具體是因爲我想靈活使用主題交換附帶的路由鍵和隊列,以及更多關於該主題未來擴展的選項。我可能是錯誤的,因爲...

我也希望有兩個或更多的消費者使用每個通知。作爲基準,我希望每個發佈的通知都能在數據庫中結束。此外,我希望每個通知都可以被客戶端應用程序使用(例如,Web應用程序使用並進一步推送套接字以便在沒有db輪詢的情況下立即通知用戶)。

這聽起來像是一個扇出式的情況,除了我不想這樣做,因爲我需要更多的隊列來處理各種通知(我認爲 - 對AMQP來說還是新手,並試圖包裹我的頭繞它)。

是否有可能讓兩個消費者從同一隊列中得到通知(始終如一)?

例如:

  • Notif.NotifGroup.User.ThisUser通過NotificationExchange
  • 有無dbListener結合Notif.#
  • 有無mvcClientListener也結合Notif.#(並且進一步確定用戶是否在線並經由套接字下游推)

我不知道如果我在正確的軌道她即我正在讀的是「多個消費者進入同一隊列以循環方式進行負載均衡」,坦率地說,我不知道這意味着什麼。

是否有可能有一個主題交流,其中兩個消費者可以從一致同一個隊列(例如,相同的路由鍵)讀取相同的消息,或者我必須去與扇出交易所呢?

謝謝。

回答

2

是否有可能讓兩個消費者從同一隊列中得到通知(始終如一)?

是的,但是這不是你想要的。

當您在一個隊列上有多個使用者時,使用者是循環負載均衡。如果消費者1接收消息,消費者2不能接收

相反,你想要做的是增加額外的路徑處理程序爲每一個消費者,並讓每個消費者創造它自己的隊列。

例如NotificationEx可能具有對Notif.#的綁定,其推動到dbQueue。同一個交易所將有一個Notif.#的綁定,它將消息推送到mvcQueue

您的數據庫使用者將從dbQueue消耗,並且您的Web應用程序將從mvcQueue消耗。

這使得添加新的消費者非常容易,每個消費者都有自己的隊列並綁定到交易所。


FWIW,對於任何給定的情況都沒有「正確」或「錯誤」的交換類型。您可以爲任何情況進行任何交換類型的工作。但是,某些交換類型可以更容易地處理某些情況。

你可能想看看我的RabbitMQ的電子書供關於更換類型,其通常被接受的「最佳使用情況」的詳細信息,以及它們如何能夠在相當有趣的場景應用:https://leanpub.com/b/rmq-layout-and-patterns

+0

謝謝 - 我hadn」如果我可以根據相同的「推送標準」創建兩個完全分開的隊列(因爲缺乏正確的術語 - 我將不得不更仔細地查看這些細節)。作爲一個便箋,我今天早上開始深入研究RabbitMQ和AMQP,這是我在SO上看到的關於這個主題的第四篇文章(也可能有一兩篇博文)我購買了一個幾小時前的電子書。很有幫助。 – jleach

+0

順便說一下,如果偶然可以舉一個快速的例子來說明如何創建這些單獨的隊列,那就太棒了。如果沒有,我會最終找到它,但我認爲我還沒有發現它,並且RabbitMQ的內容似乎沒有涵蓋這種情況。再次感謝 – jleach

+0

很高興我的工作很有幫助! :)對於多個隊列,它與創建單個隊列並將其綁定到交換機的方式相同。但是您需要做兩件事:1)確保每個應用程序實例只有1個RMQ連接,並且2)爲每個使用者使用一個新的通道。 1連接,該連接中有許多通道。連接是昂貴且有限的。頻道很便宜,幾乎沒有限制。所有真實的工作都是在頻道上完成的,最簡單的方法是有1個頻道專用於1個事物。希望有所幫助! –

相關問題