2017-02-17 215 views
0

首先,我知道已經有類似問題here的答案,但我仍然不確定這是因爲RabbitMQ的不可能性還是因爲我的避風港沒有足夠的研究。多位消費者如何在RabbitMQ中訂閱相同的主題並獲取相同的消息

我來自JS/Node背景,其中事件發佈/訂閱模式的工作方式如下:當許多消費者使用發佈/訂閱模式訂閱同一主題時,只要某個發佈者發佈該消息,他們都應該獲得相同的消息。

我期望與消息代理實現相同的模式。


例如:

消費者1監聽'request.user.#'

消費者2偵聽'request.user.#'

消費者3監聽'request.#.#'

生產者1發佈到主題'request.user.add'

生產者2發佈到主題'request.user.detail'


實際上並(根據該RabbitMQ example about Topics

Consumer 3得到兩個消息什麼RabbitMQ的,而無論是Consumer 1Consumer 2獲取第一消息,並且只有他們中的任何一個都得到第二條消息


我希望實現

三他們得到兩個消息。


你有什麼想法通過消息代理(RabbitMQ中的最高優先級)來實現嗎?請指出我是否錯過了一些東西,或者在我的問題的某處不清楚。

在此先感謝。


編輯與解決方案:

感謝@cantSleepNow,這裏是我想出了他的暗示後Consumer 1Consumer 2代碼(的NodeJS):

var amqp = require('amqplib/callback_api'); 

amqp.connect('amqp://localhost', (err, conn) => { 
    conn.createChannel((err, ch) => { 
    var ex = 'topic_exchange'; // Exchange name  
    ch.assertExchange(ex, 'topic'); // Exchange with 'topic' type  
    ch.assertQueue('', {exclusive: true}, (err, q) => { 
     ch.bindQueue(q.queue, ex, 'request.user.#'); // Topic pattern 
     ch.consume(q.queue, (msg) => { 
     // Process message 
     }); 
    }); 
    }); 
}); 
+0

是RabbitMQ您的「解決方案」的必要組成部分?因爲這是麪包和黃油Mosquitto –

+0

@JaromandaX我願意接受所有建議,並會試一試,我只是對RabbitMQ更感興趣。 – hirikarate

回答

0

我期望實現的內容
其中三個獲取這兩個消息。

那麼簡單地使用話題交換,並讓每個消費者用合適的路由鍵聲明它自己的隊列。

當你發佈,你發佈到某個主題交換(讓我們稱之爲E1)(例如)'request.user.add'並綁定到E1與匹配路由鍵(因爲我們在這裏討論的話題所有隊列)會得到消息。

也許可以這樣說:一條消息從一個隊列中消耗一次,並且從一次交換中消耗多少隊列(通過適當的路由密鑰)。

編輯@hirikarate後添加解決問題

好吧,我不使用JavaScript,但我會盡力幫助:)隨着exclusive你說,只有一個消費者可以連接到隊列,這是好的。另外,如果你在每個消費者中創建一個具有唯一名稱的隊列,你會獲得幾乎相同的結果(顯然不同的是,其他消費者可以從中消費)。同樣,不知道在JS中,但應該有一個你可以用給定的名字創建一個隊列,或者讓服務器將名稱返回給你。其他則看起來不錯,你只需要測試它。

+0

我用我提出的解決方案編輯了我的問題,請看看並給我反饋。 – hirikarate

+0

@hirikarate好吧,我已經添加了一些答案,因爲它太長的評論。 – cantSleepNow

+0

使用emptry字符串調用assertQueue作爲第一個參數將告訴RabbitMQ創建一個隊列併爲其選擇唯一的名稱。根據這個鏈接https://www.rabbitmq.com/tutorials/tutorial-three-javascript.html(臨時隊列)。我沒有讓兩個消費者綁定到相同的隊列,因爲他們中只有一個從隊列中獲取消息。順便說一句,我有你的想法,並將其標記爲最終答案。我會做更多的測試。 – hirikarate

相關問題