雲訊息佇列 RabbitMQ 版的死信Exchange適用於處理被消費者否定應答或重試失敗的訊息。本文介紹死信Exchange的核心概念、路由流程、配置方式、注意事項和更多資訊。
核心概念
死信Exchange
用於路由死信訊息的Exchange。死信Exchange會根據Binding Key、死信Routing Key、Header屬性將死信訊息投遞至死信Queue。死信Exchange可以是任何一種常見類型的Exchange,例如Direct Exchange。
死信Routing Key
死信訊息的路由規則。如果不設定死信訊息的Routing Key,則死信訊息的Routing Key預設為訊息本身的Routing Key。
死信訊息
死信Queue
死信Exchange綁定的Queue,用於儲存死信訊息。
路由流程
死信Exchange路由死信訊息的流程如下:
生產者將訊息發送到Exchange。
Exchange將訊息路由到Queue。
消費者從Queue拉取訊息。
消費者消費失敗後訊息重試次數超過16次依然沒有成功,或者消費者沒有消費訊息而直接否定應答,訊息變成死信訊息。
Queue根據x-dead-letter-exchange將死信訊息發送到死信Exchange,並根據x-dead-letter-routing-key為死信訊息設定死信Routing Key。
死信Exchange將死信訊息路由到死信Queue。

注意事項
雲訊息佇列 RabbitMQ 版不支援跨Vhost路由死信訊息,即Queue被指定的死信Exchange必須和該Queue在同一個Vhost內。
雲訊息佇列 RabbitMQ 版不支援修改Queue的死信Exchange。如果您需要修改某個Queue的死信Exchange,您需要刪除該Queue後,在重新建立時設定死信Exchange。
配置方式
雲訊息佇列 RabbitMQ 版支援以下方式配置死信Exchange:
控制台
您可以在雲訊息佇列 RabbitMQ 版控制台建立Queue時,為其配置死信Exchange。
在概览頁面的资源分布地區,選擇地區。
在实例列表頁面,單擊目標執行個體名稱。
在左側導覽列,單擊Queue 列表。
在Queue 列表頁面,在当前 Vhost右側的切换下拉式清單中,選擇Vhost,單擊创建 Queue。
在创建 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-exchange和x-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 | 包含更多關於死信的詳細資料的數組。
|
訊息成為死信訊息的可能原因如下:
expired(訊息到期)
nack(訊息nack且requeue為false)
reject(訊息被拒絕且requeue為false)
exceed consumer times(消費次數超限)
開啟無效信件佇列的TTL功能
預設情況下,死信訊息進入無效信件佇列後,TTL(Time-To-Live,存活時間)功能會被禁用,這意味著死信訊息進入無效信件佇列後,不會因存活時間到期而路由到其它無效信件佇列或被自動刪除。您可以通過控制台啟用執行個體的無效信件佇列TTL功能。啟用後,死信訊息被轉移到無效信件佇列後,將遵循無效信件佇列設定的TTL能力,在存活時間到期後被轉寄到其它無效信件佇列。
執行個體限制
支援開啟TTL功能的執行個體類型有:Serverless系列執行個體、預付費系列執行個體中的企業版和鉑金版。
操作步驟
在雲訊息佇列 RabbitMQ 版实例列表頁面,單擊目標執行個體名稱。
在实例详情頁面,單擊实例使用限制頁簽。
在是否支持死信队列的TTL功能右側單擊开通,為無效信件佇列開啟TTL功能。
在配置無效信件佇列時,存在形成訊息迴圈的風險。例如,將隊列A的無效信件佇列設定為隊列B,並將隊列B的無效信件佇列設定為隊列A,那麼會形成一個死信訊息的迴圈路由。如果在整個路由迴圈中沒有出現任何訊息拒絕(reject)事件,一旦檢測到這種迴圈,涉及的死信訊息將不再具有TTL功能。
死信訊息在多個隊列間的路由次數限制為最多16次,一旦達到路由次數上限,相關死信訊息將不再具有TTL功能。
更多資訊
關於如何刪除死信Exchange和為死信Exchange綁定死信Queue,請參見Exchange管理。