2016-10-25 46 views
1

我有一個關於third RabbitMQ tutorial的問題。我試圖實現類似的東西,除非不能保證消費者在生產者向交易所發送消息時運行。訪問隊列綁定之前發送的交換消息

所以,我有我的製片人,其消息發佈給扇出交換:

$channel->exchange_declare('my_exchange', 'fanout', false, false, false); 
$channel->basic_publish('my_message', 'my_exchange'); 

在我的出版商,我宣佈隊列,然後我綁定到Exchange:

list($queueName,,) = $channel->queue_declare("", false, false, true, false); 
$channel->queue_bind($queueName, 'my_exchange'); 

而且這是我的問題是根源。該教程說:

如果沒有隊列綁定到交換所,消息將丟失, 但這對我們來說沒問題;如果沒有消費者正在收聽,我們可以放心地丟棄消息 。

有沒有辦法以某種方式保留這些消息,所以當消費者啓動時,它會訪問以前發送的消息?我想出瞭如何做到這一點的唯一方法是在我的製片人和我的發行人中聲明同一個隊列,但這種方式有損於爲不同消費者進行交換和單獨隊列的目的。

回答

2

隊列需要存在,實際上誰創建它們並不重要:它可以是生產者(我強烈勸阻),消費者,通過rest api,rabbitmqctl創建隊列的第三個管理員應用程序。 ..如果你想稍後消費隊列,只要確保它們是持久的,並且消息的TTL足夠長(如果需要,也是持久消息)。但要注意你的隊列沒有進入流動狀態。

我想出如何做到這一點是聲明相同的隊列 在我的製作與發佈,但它那種違背了針對不同消費者的交流和單獨的隊列中的 目的的唯一途徑。

首先 - 我想你的意思是說in my producer and my subscriber :)
其次,對於消費者單獨的隊列(或每用戶隊列)只是在這個例子。請記住,這是爲了扇出式交換,並且每個消費者都會放棄一個獨佔隊列 - 當消費者斷​​開連接時,隊列就會消失。這就是爲什麼that's okay for us,因爲我們只是廣播,誰想要廣播(消息)需要得到它。扇出交換隻是將消息放入綁定到它的所有隊列中,就是這樣。
讓多個消費者從同一隊列消耗是完全可以的(look at tutorial 2)。

所以你只需要考慮你的用例。當然,創建扇出交換和爲消費者預先設置消息是沒有意義的。也許你只需要一些路由鍵或其他的東西。

在這個例子中(所以教程3),有一個brodcast的消息,如果沒有人得到他們,不是一個大的(或小的)交易。如果有人想要他們,他們需要得到他們。這就像電視頻道 - 無論有人在看或不在,信號都會繼續。

1

消費者應該附加排隊,他們不應該宣佈自己的隊列。把隊列想象成可以完成的工作。根據工作量的不同,您可以將N個消費者添加到這些隊列中以完成工作。

當您創建交換時,您應該有一個或多個連接到該交換的隊列(工作桶)。如果你這樣做,消息將流入隊列並開始排隊(赦免雙關語)。您的消費者可以在準備就緒時開始附加工作並開始工作。