2016-06-13 83 views
0

我創建了一個使用RabbitMQ進行消息傳遞的基本應用程序。消息在一臺服務器上發佈,然後下游的另一臺服務器將有一個消耗信息的長時間運行的進程。現在,我把它設置如下:RabbitMQ/AMQP HA App:消費者死亡/退出後的持續隊列?

出版商:

  1. 聲明直接交換myexchange
  2. 發佈消息myexchange交換路由鍵payload.routingkey

Co nsumer程序:

  1. 聲明直接交換myexchange
  2. 聲明隊列我的專用隊列名稱(可選擇耐用設置爲true
  3. 綁定我的專用隊列名稱排隊到myexchange exchange
  4. 消費消息my-specific-queue-name

我已經有了這個過程運作良好。我遇到的情況是,如果我的消費者程序死亡,似乎發佈到myexchange的新消息將丟失,因爲沒有隊列將被綁定到交換機。是否有一種配置,即使消費者程序消失,消息仍然可以排隊,以便當消費者程序重新聯機時,消息仍然能夠被接收?

+0

哪些是您使用的書寫語言的客戶端? – cantSleepNow

+0

@cantSleepNow爲兩個客戶端使用perl。我正在使用[Net :: RabbitMQ](https://metacpan.org/pod/Net::RabbitMQ)模塊。 – Devin

+0

檢查聲明隊列時,什麼是「獨家」參數的默認值。由於您將「持久」設置爲true,因此可能是,如果「排他」爲真,那麼一旦消費者斷開或死亡,隊列就會被刪除 – cantSleepNow

回答

0

當我寫這個問題,我似乎意識到了一個答案,下面公佈。當然,如果這是一個糟糕的主意,或者你有另一個建議,那就開除吧。

如果使用默認交換(使用空字符串作爲名稱進行交換),則可以聲明隊列並自動將其綁定到此默認交換(請參閱Default Exchange)。所以,你可以在發佈聲明你我的專用隊列名稱隊列,然後重新聲明,並開始在消費者腳本它消耗。在AMQP/RabbitMQ中,您可以多次重新聲明事物,只有在它們不存在時纔會創建它們。由於您在發佈者上聲明瞭隊列,因此如果有其他系統正在偵聽來自其的消息,則無關緊要。