全部產品
Search
文件中心

ApsaraMQ for RabbitMQ:死信Exchange

更新時間:Sep 29, 2025

雲訊息佇列 RabbitMQ 版的死信Exchange適用於處理被消費者否定應答或重試失敗的訊息。本文介紹死信Exchange的核心概念、路由流程、配置方式、注意事項和更多資訊。

核心概念

  • 死信Exchange

    • 用於路由死信訊息的Exchange。死信Exchange會根據Binding Key、死信Routing Key、Header屬性將死信訊息投遞至死信Queue。死信Exchange可以是任何一種常見類型的Exchange,例如Direct Exchange。

  • 死信Routing Key

    • 死信訊息的路由規則。如果不設定死信訊息的Routing Key,則死信訊息的Routing Key預設為訊息本身的Routing Key。

  • 死信訊息

    • 被重新發送到死信Exchange的訊息。訊息變成死信訊息的可能原因如下:

      • requeue參數被設定為 false,消費者使用basic.rejectbasic.nack否定應答(NACK)訊息。

      • 訊息重試次數超過16次,訊息重試失敗。具體資訊,請參見消費重試策略

      • 訊息到期,即訊息在Queue中存在的時間超過了設定的訊息存活時間。具體資訊,請參見訊息存活時間

  • 死信Queue

    • 死信Exchange綁定的Queue,用於儲存死信訊息。

路由流程

死信Exchange路由死信訊息的流程如下:

  1. 生產者將訊息發送到Exchange。

  2. Exchange將訊息路由到Queue。

  3. 消費者從Queue拉取訊息。

  4. 消費者消費失敗後訊息重試次數超過16次依然沒有成功,或者消費者沒有消費訊息而直接否定應答,訊息變成死信訊息。

  5. Queue根據x-dead-letter-exchange將死信訊息發送到死信Exchange,並根據x-dead-letter-routing-key為死信訊息設定死信Routing Key。

  6. 死信Exchange將死信訊息路由到死信Queue。

dg_dead_letter_message_flow

注意事項

  • 雲訊息佇列 RabbitMQ 版不支援跨Vhost路由死信訊息,即Queue被指定的死信Exchange必須和該Queue在同一個Vhost內。

  • 雲訊息佇列 RabbitMQ 版不支援修改Queue的死信Exchange。如果您需要修改某個Queue的死信Exchange,您需要刪除該Queue後,在重新建立時設定死信Exchange。

配置方式

雲訊息佇列 RabbitMQ 版支援以下方式配置死信Exchange:

控制台

您可以在雲訊息佇列 RabbitMQ 版控制台建立Queue時,為其配置死信Exchange。

  1. 登入雲訊息佇列 RabbitMQ 版控制台

  2. 概览頁面的资源分布地區,選擇地區。

  3. 实例列表頁面,單擊目標執行個體名稱。

  4. 在左側導覽列,單擊Queue 列表

  5. Queue 列表頁面,在当前 Vhost右側的切换下拉式清單中,選擇Vhost,單擊创建 Queue

  6. 创建 Queue面板,配置以下參數,然後單擊確定

    參數

    描述

    說明

    Queue 名称

    Queue的名稱

    • 只能包含字母、數字、短劃線(-)、底線(_)、半形句號(.)、井號(#)、正斜線(/)、at符號(@)。

    • 長度限制在1~255字元。

    • 建立後無法修改,只能刪除重建。

    • 以amq.開頭的為保留欄位,因此不能使用。例如:amq.test。

    Auto Delete

    最後一個Consumer取消訂閱後,Queue是否自動刪除。

    • true:在訂閱該Queue訊息的最後一個Consumer取消訂閱該Queue的訊息後,自動刪除該Queue。

    • false:在訂閱該Queue訊息的最後一個Consumer取消訂閱該Queue的訊息後,不自動刪除該Queue。

    重试策略

    配置Queue重試策略。各執行個體策略參數取值,請參見執行個體重試策略參數說明

    • 是否繼承執行個體配置

      • :繼承執行個體預設配置。

      • :自訂配置。

    • 最大投遞次數:系統將一條訊息嘗試投遞給消費者的最大次數限制。單位:次。

    • 消費逾時時間:消費者在接收和處理訊息時允許的最大時間限制。單位:秒。

    死信策略

    Queue的參數設定,可用於設定死信Exchange、死信Routing Key和訊息存活時間。

    • DeadLetterExchange:指定死信訊息發送的目標Exchange。

    • DeadLetterRoutingKey:指定死信訊息的Routing Key,即死信Exchange會將訊息發送至匹配該死信Routing Key所對應的Queue。

    • MessageTTL:訊息存活時間,單位毫秒(ms)。在指定時間內未被成功消費的訊息會變成死信訊息,該訊息將會被發送到死信Exchange。更多資訊,請參見訊息存活時間

API

您可以在通過API建立Queue時,為其配置死信Exchange。更多資訊,請參見CreateQueue

用戶端

您可以在雲訊息佇列 RabbitMQ 版用戶端聲明Queue時,為其配置死信Exchange。

通過x-dead-letter-exchangex-dead-letter-routing-key設定死信訊息要發送的Exchange以及死信訊息的Routing Key。

例如,聲明一個名稱為some.exchange.name、類型為direct的Exchange,使用 x-dead-letter-exchange將該Exchange設定為死信Exchange,使用x-dead-letter-routing-key將死信訊息的Routing Key設定為demo-routing-key

Java範例程式碼如下:

channel.exchangeDeclare("some.exchange.name", "direct");
Map<String, Object> args = new HashMap<String, Object>();
arguments.put("x-dead-letter-exchange", "some.exchange.name");
arguments.put("x-dead-letter-routing-key", "demo-routing-key");
channel.queueDeclare("MyQueue", false, false, false, arguments);

死信Header

死信訊息Header中包含以下資訊:

Header

說明

x-first-death-exchange

訊息第一次成為死信時的交換器。

x-first-death-queue

訊息第一次成為死信時的隊列。

x-first-death-reason

訊息第一次成為死信時的原因。

x-death-total

訊息成為死信的次數。

x-death

包含更多關於死信的詳細資料的數組。

  • reason: 成為死信時的原因。

  • queue: 成為死信時的隊列。

  • exchange: 成為死信時的交換器。

  • routing-keys: 成為死信時的路由鍵。

  • count: 在queue上因為reason成為死信的次數。

  • time: 成為死信的時間。

訊息成為死信訊息的可能原因如下:

  • expired(訊息到期)

  • nack(訊息nack且requeue為false)

  • reject(訊息被拒絕且requeue為false)

  • exceed consumer times(消費次數超限)

開啟無效信件佇列的TTL功能

預設情況下,死信訊息進入無效信件佇列後,TTL(Time-To-Live,存活時間)功能會被禁用,這意味著死信訊息進入無效信件佇列後,不會因存活時間到期而路由到其它無效信件佇列或被自動刪除。您可以通過控制台啟用執行個體的無效信件佇列TTL功能。啟用後,死信訊息被轉移到無效信件佇列後,將遵循無效信件佇列設定的TTL能力,在存活時間到期後被轉寄到其它無效信件佇列。

執行個體限制

支援開啟TTL功能的執行個體類型有:Serverless系列執行個體、預付費系列執行個體中的企業版和鉑金版。

操作步驟

  1. 雲訊息佇列 RabbitMQ 版实例列表頁面,單擊目標執行個體名稱。

  2. 实例详情頁面,單擊实例使用限制頁簽。

  3. 是否支持死信队列的TTL功能右側單擊开通,為無效信件佇列開啟TTL功能。

重要
  • 在配置無效信件佇列時,存在形成訊息迴圈的風險。例如,將隊列A的無效信件佇列設定為隊列B,並將隊列B的無效信件佇列設定為隊列A,那麼會形成一個死信訊息的迴圈路由。如果在整個路由迴圈中沒有出現任何訊息拒絕(reject)事件,一旦檢測到這種迴圈,涉及的死信訊息將不再具有TTL功能。

  • 死信訊息在多個隊列間的路由次數限制為最多16次,一旦達到路由次數上限,相關死信訊息將不再具有TTL功能。

更多資訊

關於如何刪除死信Exchange和為死信Exchange綁定死信Queue,請參見Exchange管理