[英]How to reject messages after shoveling from one queue to another?
隨着春秋的RabbitMQ我設置了兩個主題的交流x
和dlx
和兩個隊列q
和dlq
。 q
被綁定到x
和dlq
到dlx
。 dlx
被配置為q
的死信交換。
當在消息q
被拒絕(與unqueue)它被成功地發送到dlx
,然后dlq
。
現在我使用 shovel-plugin 將dlq
中的dlq
消息dlq
回q
。 只要這次成功處理消息(確認),這就會成功。
但是,如果q
中這些被鏟除的消息之一再次被拒絕,則它會被靜默丟棄。 我希望它再次發送到 DLX dlx
。 是我配置錯誤還是我誤解了 DLX 或鏟子的概念?
我懷疑你正在打這種味道......
有可能形成消息死信循環。 例如,當隊列將死信消息發送到默認交換而未指定死信路由鍵時,就會發生這種情況。 如果在整個循環中沒有拒絕,則此類循環中的消息(即到達同一隊列兩次的消息)將被丟棄。
...因為你在鏟。 請參閱死信交換。
相反,請使用 TTL 和死信配置來配置 DLQ,從而將過期消息路由回原始隊列。 這樣, x-death
標頭獲得兩個條目 - 1 表示來自原始隊列的拒絕,1 表示來自 DLQ 的到期。
我猜測,通過鏟,經紀人認為存在一個循環。
我不認為你的問題是周期。 假設您正在使用 Rabbit 管理 GUI 中的 shovel 插件,這會更改消息的路由鍵以明確使用“默認交換”上隊列的路由鍵
https://www.rabbitmq.com/tutorials/amqp-concepts.html#exchange-default
默認交換是沒有經紀人預先聲明的名稱(空字符串)的直接交換。 它有一個特殊的屬性,使它對簡單的應用程序非常有用:創建的每個隊列都會自動綁定到一個與隊列名稱相同的路由鍵。
根據您上面的示例,我假設您有以下設置:
q
參數 - x-dead-letter-exchange = dlx
q
綁定: test_message
dlq
綁定: test_message
因此,如果您使用test_message
的路由鍵向x
發送消息,則它的路由方式如下:
q
q
得到消息,NACK發送,再發送到dlx
與路由鍵test_message
dlx
具有dlq
配置為綁定到test_message
路由關鍵,所以出現在消息dlq
現在,當您使用dlq
的 shovel 插件將所有消息移動到q
如下所示:
然后這會發送一條消息到exchange = ''
和routing_key = 'q'
。 同樣來自https://www.rabbitmq.com/dlx.html#using-optional-queue-arguments它指出:
如果未設置,則將使用消息自己的路由鍵。
所以現在這就是發生的事情:
q
, routing_key = q
x-dead-letter-routing-key
配置,它是一紙空文到dlx
與routing_key q
dlx
q ,消息被丟棄2個潛在的修復:
dlq
另一個綁定添加到routing_key = q
q
隊列上的x-dead-letter-routing-key
總是在死信上發送到相同的路由鍵
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.