簡體   English   中英

RabbitMQ 第一次后消息沒有發送到死信

[英]RabbitMQ Messages not getting sent to dead letter after first time

我們已將隊列配置為將死信消息(特別是 nack'ed 消息)發送到死信交換,該交換按其原始主題將它們路由到各個死信隊列。 這一切都很好,當消息被拒絕時,它們被發送到正確的死信隊列。

當我們將這些消息從 dlq 鏟回正常隊列時,問題就來了,在那里它們再次被拒絕。 出於某種原因,第二次通過它們就消失了,而不是被送回死信交換。

我假設正在進行某種“循環消息路由”檢測,但找不到類似的東西。 第二次檢查消息會給出所有預期的標題,所以我不確定這樣的事情甚至可以基於什么。 任何關於下一步去哪里或兔子是否有這樣的東西的建議將不勝感激!

如果有需要,我們的消費者寫在python使用鼠兔庫進行通信。

假設您有以下隊列/交換:

交易所

  • global_exchange - 你的主要交易所
  • DLX另一個專門針對死信的交易所

隊列

  • queue - 你在global_exchange中的主隊列。 包含arguments=x-dead-letter-exchange: 'DLX'
  • queue.dlq - 你在global_exchange中的死信隊列

綁定

  • test_message routing_key 綁定到queuequeue.dlq

最后,我假設您像這樣在queue.dlq管理頁面上使用 shovel 插件,將消息從queue.dlq移動到queue中:

在此處輸入圖像描述

以下是當您將帶有test_message作為routing_key的消息發送到global_exchange時路由的工作方式:

  1. 消息從test_message上的綁定進入queue
  2. 消費者 nack 的(nack 或 reject 無關緊要)消息,從而使其成為死信
  3. x-dead-letter-exchange參數使用routing_key= test_message將其發送到DLX
  4. 由於queue.dlq綁定,該隊列接收消息

當您使用那個特定的管理面板將消息推回queue時,它使用默認交換 會更改路由鍵 因此,第二次收到的消息有一個路由鍵,它等於您要放入的隊列的名稱。

由於您沒有配置x-dead-letter-routing-key ,因此消息對當前路由鍵是死信的:

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

所以在鏟子的結果上,這是它的路由方式:

  1. 消息出現在queue中, routing_key = queue
  2. 由於沒有配置 x-dead-letter-routing-key,它死信給DLX with routing_key = queue
  3. 沒有綁定到DLX中的queue ,消息被丟棄

有 2 個潛在的解決方法:

  1. 添加另一個綁定到queue.dlqrouting_key = queue
  2. 手動將queue上的x-dead-letter-routing-key配置為始終發送到死信上的相同路由鍵,無論最初發送給它的消息是什么,並確保在DLX中綁定到它

暫無
暫無

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

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