簡體   English   中英

從一個隊列鏟到另一個隊列后如何拒絕消息?

[英]How to reject messages after shoveling from one queue to another?

隨着春秋的RabbitMQ我設置了兩個主題的交流xdlx和兩個隊列qdlq q被綁定到xdlqdlx dlx被配置為q的死信交換。

當在消息q被拒絕(與unqueue)它被成功地發送到dlx ,然后dlq

現在我使用 shovel-plugin 將dlq中的dlq消息dlqq 只要這次成功處理消息(確認),這就會成功。

但是,如果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發送消息,則它的路由方式如下:

  1. 出現在q
  2. 消費者在q得到消息,NACK發送,再發送到dlx與路由鍵test_message
  3. dlx具有dlq配置為綁定到test_message路由關鍵,所以出現在消息dlq

現在,當您使用dlq的 shovel 插件將所有消息移動到q如下所示:

在此處輸入圖片說明

然后這會發送一條消息到exchange = ''routing_key = 'q' 同樣來自https://www.rabbitmq.com/dlx.html#using-optional-queue-arguments它指出:

如果未設置,則將使用消息自己的路由鍵。

所以現在這就是發生的事情:

  1. 消息出現在qrouting_key = q
  2. 由於沒有x-dead-letter-routing-key配置,它是一紙空文到dlx與routing_key q
  3. 沒有綁定到dlx q ,消息被丟棄

2個潛在的修復:

  1. dlq另一個綁定添加到routing_key = q
  2. 手動配置q隊列上的x-dead-letter-routing-key總是在死信上發送到相同的路由鍵

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM