2016-01-15 67 views
0

我們有一個RabbitMQ交換機,它在我們系統的幾個組件之間交換消息。兔子MQ過濾

每個組件都是交換的發佈者和訂閱者。

我們需要找到確保每個應用程序不會收到其發送到交換信息的方式。

例如。

應用程序1發送刷新消息。我們希望這個去交換的所有用戶除了應用1

我可以看到,你可以指定路由的屬性,但是這似乎要定義沒有你不想要的那些消息。

任何想法?

回答

0

你要求的東西不可能直接用於RabbitMQ。從RMQ的工作方式來看,這有點落後,應該如何設計系統。

也就是說,你不能過濾或者是「選擇性的」關於哪些消息給消費者接收。最終,the "selective consumer" is an anti-pattern in RabbitMQ。一旦消息在隊列中,收聽該隊列的消費者可能會收到該消息(取決於連接的消費者數量等)。

根據我的經驗,處理此問題的最佳方法是更改​​您的RMQ拓撲和應用程序設計,以便這不會成爲問題(可能無法實現)或讓您的應用程序知道它發送的消息,並忽略它發送的任何內容。

我覺得第一個選項是更好的(確保這一點是不會有良好的應用程序/拓撲設計發生),但第二個選項往往容易...

要做到這一點,你可以添加自定義屬性到您的消息,如「發佈者id」或類似。請檢查消費者代碼,確保消息的發佈者ID是而不是與其自己的發佈者ID相匹配。如果確實匹配,則不再進行回覆。如果不匹配,則正常處理消息。

+0

的確認爲這將是如此,但只是想檢查那裏並不是RMQ中的第一個。重新設計不是一個選項,因爲此消息是緩存重置消息,指示數據庫已更新,並且所有節點都應丟棄其該類型的本地緩存。因爲這樣既要訂閱又要聽 – GreatSamps

0

,用戶可以爲每個組件單獨的路由鍵(例如app1app2app3,...)和訂閱每個組件的所有其他路由鍵節選了自己。

所以,當應用程序1發送消息時,它會與路由鍵app1發送它,但它訂閱只app2app3,....

+0

同意這可行,但我們的應用程序可能會有數百個節點,因此靜態定義它們不是一種選擇。 – GreatSamps

+0

那麼你應該使用@Derick Bailey提出的解決方案。至少,我不知道其他選擇。 –