2011-05-13 42 views
0

我進入全AMQP的事情,我有一個關於下使用哪種類型的交換類型的問題,以下情形的:AMQP交換類型

1)我有必要建立一個工作池,每個工人在收到消息時會做某些事情。現在我想讓不同的工作者參與不同類型的任務;我可以通過以主題方式使用每條消息的路由鍵來指定。在消費者端,與kombu玩一下我注意到,如果我指定相同的隊列名稱,但使用不同的路由鍵我不能「過濾」消息。例如,如果我有一個使用'#'的消費者,另一個使用'foo。#' - 兩個使用相同的隊列名稱,後一個消費者將與前一個消費者一起循環。這是預期的嗎?我在同一臺機器上運行兩個用戶。 2)因此,我爲每個消費者構建了唯一的隊列名稱,這一次,每個消費者只會得到我要求的路由密鑰。然而,因爲它們是不同的隊列,我可能不僅僅是一個消費者獲得任務。例如,如果消費者1具有關鍵'#'並且消費者2具有'foo。#';當消費者2接收(並確認)消息時,消費者1也得到相同的消息。這不是我想要的;我想只有一個消費者只能得到這個消息。有沒有辦法在不寫'任務管理器'的情況下實現這一點?

歡呼聲,

回答

0

對於大多數人來說,最好只使用適用於所有的話題交換,直到你完全瞭解AMQP工作。只需爲隊列選擇正確的綁定鍵,即可獲得扇出和直接行爲。例如,如果您使用「#」作爲綁定鍵,那麼該隊列就像連接到直接交換機一樣。如果將兩個或更多隊列綁定到相同的路由密鑰,那麼如果是扇出交換,那麼這些隊列的功能就如同它。

預計會發生循環賽行爲。這兩個任務都訂閱了完全相同的隊列。綁定鍵不同的事實只是混淆了一切。可能是誰最後綁定,將爲每個隊列用戶設置綁定密鑰。最好不要這樣做。我建立了一個系統,其中幾個隊列有4到15個完全相同工作者代碼的實例,將消息從同一個隊列中拉出,然後從Web服務中收集數據。我甚至讓工作人員在不同的CPU上運行,儘管最終不需要性能。

我不知道你爲什麼要在綁定鍵中使用通配符。如果你有8個消費者命名爲A到H,並且每個人都做不同的工作,那麼爲什麼不發佈帶有路由鍵的消息work.A通過work.H然後使用相同的綁定鍵work.A通過work.H.這樣,如果你有多個工人B的實例,他們都綁定work.B,沒有消息傳遞兩次。

此外,如果您在處理完消息後沒有回覆消息,那麼最終它會返回到隊列中並重新遞送。希望您在成功處理郵件後進行確認。不需要任務管理器,只需更好地瞭解所有AMQP旋鈕。