2012-11-29 41 views
7

我想在RabbitMQ中實現一個dlx隊列。 的情況是很容易 我有2個隊列: 1)活着 2)死亡(X-死信交換: 「立即」,X-消息-TTL:5000)死信交換RabbitMQ丟棄消息

和交流「立即「綁定到1)活着

我試着運行這個例子: http://blog.james-carr.org/2012/03/30/rabbitmq-sending-a-message-to-be-consumed-later/ 但似乎TTL過期,他們不要讓她在交易所公佈後,在消息被丟棄,所以我活着隊列總是空。

我還嘗試在管理控制檯中手動創建隊列,並獲得相同的行爲。

我與Ubuntu/RabbitMQ的3.0.0,並與Mac OS X和RabbitMQ的2.8.7

我缺少的東西進行測試呢?

+0

您是否希望從「活動」隊列過期的郵件進入「死」隊列? – kzhen

+0

沒有其實它的相反,我希望從死隊列過期的消息到活着的隊列。 –

+0

他們如何進入死隊? – kzhen

回答

8

當RabbitMQ中的消息'消失'時,問題通常由綁定引起。所以,要想讓你的榜樣工作,我做了以下內容:

  1. 創建2個隊列,活的,死的(與TTL和DLX)

  2. 創建了一個交流稱爲即時類型的直接的

  3. 在交換「immediate」和隊列「alive」之間創建了一個綁定,路由鍵爲「dead」 - 原因是因爲,消息進入死隊列的路由密鑰(如果使用默認交換「死」這需要在死信交換中的綁定中匹配)。

重要這兒的一部分是在立即交流和活着隊列之間的結合。

爲了測試我在死隊列中發佈了一條消息,我可以看到它短暫地出現在死隊列中,然後出現在活動隊列中。

+0

現在工作!非常感謝! –

+0

我做了一個秒殺,打了幾個showstoppers: 1.消息只是DLQ:當在Q的頂端(http://www.rabbitmq.com/ttl.html - 注意部分) 這意味着如果我首先設置msg 1在4小時後過期,msg2在1小時後過期msg2只會在msg1過期後過期。 2.消息的TTL由Rabbit保存,所以可以說你使用10秒的短暫超時。如果消費者在過期10秒後(由於積壓)未能消費該消息,則該消息將被丟棄並丟失 以上已經使用Rabbit 3.0.1進行了驗證。你們看到任何解決方法嗎? –

+2

@AndreasÖhlund,如果可能的話,嘗試使用「每隊列TTL」設計,而不是「每個消息TTL」。 –