2014-10-30 60 views
0

使用RabbitMQ,我有兩種類型的使用者:FileConsumer將消息寫入文件,MailConsumer將消息寫入郵件。每種類型可能有多個消費者,例如三個運行MailConsumer和一個FileConsumer實例。如何發佈到具有工作隊列行爲的多個隊列?

我怎樣才能做到這一點:

  • 每個發佈的消息應該只有一個FileConsumer實例和一個MailConsumer實例
  • 發佈一條消息,應做一次,而不是一次對每個隊列進行處理(如果可能的話)
  • 如果沒有連接消費者,消息應該排隊,直到消耗掉,不會掉線

我應該使用什麼類型的交換等來獲得牛逼他的行爲?我真的很想看到一些示例/僞代碼來說明這一點。

queues

這應該是很容易做到的,但我不能從文檔看着辦吧。看起來fanout example應該可以工作,但我對這些「匿名隊列」感到困惑,這似乎會導致向每個消費者發送相同的消息。

回答

2

如果您創建的隊列沒有auto-delete標誌,那麼即使在消費者斷開連接後,隊列也將保持活動狀態。

請注意,如果您將隊列聲明爲持久性隊列,即使在代理重新啓動後,它也會存在。

如果您將發佈包含delivery-mode=2屬性集的消息(即消息將保持持久性),那麼即使在代理重新啓動之後,此類消息仍會保持持久性(這對於使隊列持久化)隊列非常重要。

使用fanout交換類型不是強制性的。如果需要,您還可以使用topic獲得更好的消息路由處理。

UPD:逐步獲取您使用模式顯示的內容。

  1. 聲明持久性的交流,說main,爲exchange.declare(exchange-name=main, type=fanout, durable=true)
  2. Delcare兩個隊列,說,filesmailsqueue.declare(queue-name=files, durable=true)queue.declare(queue-name=mails, durable=true)
  3. 綁定兩個隊列交換爲queue.bind(queue-name=files, exchange-name=main)queue.bind(queue-name=mails, exchange-name=main)

在這一點上,你可以發佈消息main交換(見注約delivery-mode以上),從隊列上的任何用戶數消耗,從filesFileConsumermailsMailConsumer。沒有任何消費者在隊列中消息將被排隊並保持隊列直到消耗(或代理重新啓動,它們不是持久的)。

+0

好的,這很有幫助。但我需要更具體的如何設置發佈者和消費者,使其像問題一樣工作。 – 2014-10-30 12:28:14

+0

用步驟編輯,以在圖表上得到。真正的代碼將取決於您使用的客戶端庫和平臺。 – pinepain 2014-10-30 13:05:23

相關問題