2015-12-03 222 views
0

我們有兩個消費者用c1(在php中)綁定交換1,隊列1和路由密鑰1;和c2(在java中)交換1,隊列1和路由密鑰2.即僅路由密鑰不同,但交換和隊列相同。rabbitmq消費者獲取不同路由密鑰的消息

在PHP

,我們結合爲下列情況

$channel->queue_bind($this->queue, $this->exchange, $this->routing1); 

在Java中,以下

channel.queueBind(queue, exchange, routing2); 

現在,當我們發佈使用路由鍵2的消息意味着C2,我們觀察到,消息以循環方式由c1和c2接收,而不是僅由c2接收。

C1和C2的發件人都在PHP中,與發件人C1具有下列功能

$channel->basic_publish($message, $this->exchange, $this->routing1); 

和發件人爲C2並以下

$channel->basic_publish($message, $this->exchange, $this->routing2); 

的我們有正確的假設?代碼有什麼問題嗎?

[Edit1]作爲實驗,我們更改爲綁定到兩個消費者和發佈者的單獨隊列。我們觀察到c2(c2和r2)的消息已經被c2和c1接收了......這裏有些事情是錯誤的。

回答

3

只有路由密鑰不同,但交換和隊列是一樣的。

你已經設計了你的隊列和消費者來產生這種行爲。

當RMQ擁有多個消費者隊列時,它會將消息從該隊列中循環到所有可用消費者。這是在RMQ中設計的 - 它允許您擴展給定隊列的消費者數量,因此您可以處理大量的消息。

如果你需要C1和C2來接收不同的消息,而不是來自Q1之間的循環消息,那麼C1和C2必須有不同的隊列,他們被訂閱。

例如:

  • E1與路由密鑰1應該去QC1
  • E1與路由鑰匙2應該去QC2
  • C1應從QC1消耗消息
  • C2應使用消息來自QC2

通過爲消費者分開排隊,您將保證消息傳遞給正確的消費者

+1

感謝您的明確解釋! – bcbishop

相關問題