2017-10-05 138 views
0

我不能完全肯定這是提出正確的地方,但我對的RabbitMQ的運作問題,實現發佈/訂閱消息系統。我調查的RabbitMQ,看它是否適合我工作的公司的需要,我找不到任何回答這些問題無論是在官方文檔或在互聯網上:訂閱一羣使用RabbitMQ的消費者?

  • 是否有可能爲一消費者訂閱一組發佈者?我想這是可能的,如果我們想要訂閱的所有發佈者都將他們的消息發送給交換機,然後將它們轉發給訂閱者。執行此操作最適合的呼氣類型是什麼?
  • 是否可以訂閱一組主題?例如,如果我們有幾個以「數據」開頭的主題,比如data_1,data_2等,是否有可能讓消費者訂閱「data *」?我沒有找到任何關於這方面的信息,但是從我所瞭解的交流工作方式看來,這似乎不太可能。
  • 是否可以有子課題,甚至是分次sopics? 從我目前瞭解的情況來看,使用主題或標題交換,子主題和子子主題基本上都是路由關鍵字的一部分,例如data.diag.signal。

我希望我已經說清楚了,我提前感謝您的回答。

回答

0

將使用Java API的例子在我的答案。

消費者是否有可能訂閱一組發佈商?

RMQ消費者並不知道出版商。它們之間的實體是隊列(和生產者(出版商)方面的交換)。 Java API com.rabbitmq.client.Channel.basicConsume(String, Consumer)只允許從一個隊列消耗。但是,您可以將相同的Consumer回調傳遞給多個隊列

另一種方法是創建每個消費者隊列,並使用channel.queueBind將其綁定到生成有趣消息的交換。或者更容易,讓他們發佈到一些通用交換並綁定到那個。

是否可以訂閱一組主題?例如,如果我們有幾個以「數據」開頭的主題,比如data_1,data_2等,是否有可能讓消費者訂閱「data *」?我沒有找到任何關於這方面的信息,但是從我所瞭解的交流工作方式看來,這似乎不太可能。

不是顯式的,因爲您需要傳入隊列名稱。 但是你可以解決與交換路由: 如果您目前的狀態是:

producer1 -> exchange-data-1 -> queue-data-1 
producer2 -> exchange-data-2 -> queue-data-2 
producer3 -> exchange-data-3 -> queue-data-3 

你也可以建立一個新的交換

producer1 -> exchange-data-1 --\ 
producer2 -> exchange-data-2 -> exchange-data-all -> queue-per-consumer -> your-consumer 
producer3 -> exchange-data-3 --/ 

是否可以有子課題,甚至分亞文化?根據我目前瞭解的情況,使用主題或標題交換,子主題和子主題基本上都是路由關鍵字的一部分,例如data.diag.signal。

有一個在RMQ無子課題的概念,但是,正如你所提到,您可以使用topic(甚至headers,更豐富的設計)交流。

+0

謝謝你的回答,這是非常有幫助的!關於話題交換的通配符,我知道可以訂閱諸如A.B. *或A。*。*之類的話題,但是可以訂閱諸如A。*。C之類的話嗎? –