2017-10-10 139 views
-4

我有一個場景,發佈者需要向已知交換機發送消息(他們不會直接知道下游隊列)。大部分消息應該傳遞給每個綁定隊列(如扇出),但有些消息只需要傳遞給特定的綁定隊列。我想避免多次交換以及多個隊列債券。RabbitMQ/AMQP交換路由策略

我當前的解決方案使用頭部路由,其中​​消息具有兩個頭中的一個,將其標識爲「全局」或「特定於某個特定子」,其中下游隊列綁定在匹配上 - 頭。我認爲這會起作用,但我覺得應該有一個更簡單的解決方案。

我試圖找到一個交換插件,將「扇出所有消息,除了特定的消息」,但我找不到這樣的插件。除此之外,還有關於如何實施這種路由策略的想法?

+0

不知道爲什麼你要downvoted,但我認爲一個話題交換將是最好的選擇這個。 – mshindal

+0

@mshindal - 不知道爲什麼;對於合法的用例來說這似乎是一個合理的問題(我已經完成了大量的研究)。關於你的建議,除非我爲每個客戶綁定兩個隊列(一個用於「所有消息」,另一個用於「特定消息」),否則我不確定如何使用主題交換進行此項工作。你有兩個隊列嗎? – eric

回答

0

對於什麼是值得的,我唯一可以找到的就是使用「標題」交換與隊列綁定使用「匹配任何」的原始解決方案,而不用編寫新的交換插件。它確實有效,迄今似乎相當快速(至少不會比典型的「主題」交換慢得多 - 我在這種情況下無法應用)。

從我對這個主題的研究中,理想的解決方案是使用RegEx或至少某種形式的「or-logic」的「主題」交換。我確實發現了一些信息,意味着RegEx被考慮但決定反對(贊成「點綴符號」主題格式),因爲後者更快,特別是因爲使用RegEx會要求每個新消息都要評估每個綁定(即沒有辦法構建「搜索捷徑」)。現在,我的「匹配任何頭文件交換」解決方案將服務於我的目的,但在未來,允許「或邏輯」的「主題」交換可能值得探索。它將允許使用單一綁定實現多個主題模式,而不會產生RegEx的開銷。但是我對Erlang沒有經驗,也沒有足夠的時間學習編寫必要的插件。如果有人有興趣合作,請聯繫我。

0

您所描述的內容確實聽起來像交換交換綁定,儘管富路由實際上是RMQ的優勢之一。

您可以創建指向扇出(對於一般情況)或主題/直接(對於特殊情況)的條目交換,並將所有路由保留爲RMQ。該entry-exchange可能是一個頭交換或直接之一,這取決於你想放什麼標題:

entry-exchange -----> fanout-exchange ---*---> multiple-fanout queues 
       \ 
       \---> the special exchange --> queue-for-special-usecase 
+0

是的,我仔細研究過使用綁定交換,但是我發現的所有解決方案(包括我相信您建議的)都需要客戶綁定到兩個不同的隊列(一個用於扇出,一個用於直接)。這是我特意試圖避免的,因爲會有大量的客戶,所以我不想把它乘以2倍。 – eric