2017-04-06 64 views
1

我想處理不成功的消息,消費者從隊列中獲取並重新排隊它們。Nack並拒絕在RabbitMQ

想象我有這樣的情況:

P => | foo | bar | baz | => C 

其中foo,酒吧和巴茲的消息。

如果消費者讀baz但不順心的事我既可以使用basic.rejectbasic.nackhttps://www.rabbitmq.com/nack.html)。使用這兩個命令中的一個,我會傳遞參數來重發消息。

問題是消息在與之前相同的位置重新排隊,所以下一條消息將再次爲baz

我想重新排隊,但將其發送回隊列的開頭:

P => | baz | foo | bar | => C 

我與我的應用程序的一些代碼行解決,但是,我不知道有沒有更好的解決方案存在可能使用直接使用RabbitMQ的一些功能。

回答

1

你可以採取死信隊列(DLQ)一看:https://www.rabbitmq.com/dlx.html

+0

是的,我讀了整個文檔昨天。這不是我正在尋找的,但顯​​然我尋找的東西不存在,死信隊列可以是一個很好的解決方法。 – xyzale

+0

這裏的隊列(FIFO)的行爲與預期完全一致,因爲您正在使用手動確認模式,所以線程將等待直到獲得確認,因爲它無法處理,因此它會嘗試以循環方式放入相同的位置。另一方面,一次又一次地處理不良信息是沒有意義的。重試2-3次(spring-amqp有直接支持),如果仍然失敗,請將其重新分類,以便以後可以分析錯誤消息的格式並直接與客戶團隊聯繫。 – lambodar

+0

可能是您可以將TTL添加到您的失敗消息並放入DLX,因此一旦它過期,它將自動移動到主隊列。 – lambodar