2014-06-11 85 views
2

我有點困惑。我試圖實現話題交流,我不確定需要什麼。話題交換含糊不清RabbitMQ

我想有幾個路由鍵和1個話題交換(默認amq.topic)。我的鑰匙會是這樣:。

  • customer.appA.created
  • customer.appB.created
  • 客戶*創建

我希望我的隊列(S)是持久的,但是,我需要1個「客戶」隊列還是2個隊列,用於appA和appB? 我讓我的出版商想通了; 連接,交換聲明,基本發佈

但我正在與消費者苦苦掙扎。假設我想打開3個控制檯,每個上述路由鍵都有一個。
我現在的用戶有:連接,交換聲明,隊列綁定,基本消耗。這些連接到一個持久的「客戶」隊列。但是,我的消息正在循環播放到每個控制檯/使用者,而不是使用路由密鑰。

所以我的問題;

  1. 對於典型的話題交換設置;你需要多少隊列?
  2. 我的消費者是否可以脫離僅使用交換綁定,還是必須包含隊列交互?
  3. 單個消息是否可能出現在2個消費者中進行話題交換(或者你是否需要粉絲)?
+0

您能否指定您使用的客戶端庫或擴展? – pinepain

+0

videlalvaro/php-amqplib。但這更多是一個抽象/背景問題。 –

+0

php-amqp擴展和php-amqplib庫有一些區別,所以在特定情況下使用哪一個是很重要的。例如,使用php-amqplib可以同時從多個隊列中使用,而使用php-amqp則不能。 – pinepain

回答

2

第一件事:交換不交付給消費者。它將消息傳遞給隊列以匹配路由選擇。

 1. For a typical topic exchange set up; how many queues do you need? 

如果你有多個消費者,那麼你將需要一個消費者隊列。

 2. Can my consumers get away with just exchange binding, or does it have to include queue interaction? 

您需要將消費者與隊列綁定,如果隊列不存在,則創建並綁定。

 3. Is it possible for a single message to appear in 2 consumers with topic exchange (or do you need fanout for that)? 

是,只有當消費者有自己的(有相同的路由鍵單獨的隊列綁定)。否則這將是循環賽的方式。

所以最好的方法是讓消費者自己的隊列與所需的路由密鑰...... !!!

+0

謝謝。我被困在思考直接的方式。所以我猜每個消費者的匿名隊列將是當時的路? –

+0

是的,我已經實現了相同的功能,在運行時創建隊列並綁定到您的路由密鑰,然後開始使用它。如果您想確保在未使用時刪除它,也可以使用「x-expires」作爲隊列。 –

+0

'如果你有多個消費者,那麼你將需要一個消費者隊列 - 這個說法是錯誤的。您可以將多個使用者附加到相同的隊列中,也可以在一個通道內同時從多個隊列中使用(如果客戶端庫支持)。 – pinepain

1

對於典型的主題交換設置;你需要多少隊列?

這取決於您的應用需求。您可以從一個隊列開始實現簡單的FIFO堆棧,然後添加更多的隊列以消耗更多的粒度消息。

我的消費者可以逃脫只是交換綁定,還是它必須包括隊列交互?

AMQP交換的想法是獲取發佈的消息並將它們放到一個或多個隊列(甚至其他交換或在一定條件下完全丟棄)。消費者只能和隊列一起工作,而發佈者只能和交換機一起工作。

對於Default Exchange,可能存在一些誤解,但它將消息路由到與路由密鑰相同的隊列名稱,並且它有時會解釋爲發佈到不正確的隊列。

單個消息是否有可能出現在2個消費者中進行話題交換(或者您是否需要粉絲)?

我想你說的是將一條消息複製到多個隊列中(雖然在你真的可能有多個消費者處理單個消息時存在一些錯誤情況)。

如果是這樣 - 確定。您可以爲隊列創建多個綁定以獲取不同的消息。這裏是一個小例子:

讓你有三個消息發佈到主題交換與三個不同的路由鍵customer.appA.created,customer.appB.created和`customer.appC.created。

您可以創建單獨的隊列通過精確的路由鍵綁定隊列收集特定信息 - customer.appA.createdcustomer.appB.created等等,或者因爲你已經注意到,結合隊列通配符路由鍵customer.*.created

要僅收集appA和appB的消息,您可以使用兩個綁定創建隊列customer.appA.createdcustomer.appB.created,因此您將在一個隊列中獲得兩個消息類型。