對於消費失敗且重試後依然失敗的訊息,雲訊息佇列 RocketMQ 版不會立丟棄,而是將訊息轉寄至指定的隊列中,即無效信件佇列,這些訊息即為死信訊息。當消費失敗的原因排查並解決後,您可以重發這些死信訊息,讓消費者重新消費;若您暫時無法處理這些死信訊息,為避免到期後死信訊息被刪除,您也可以先將死信訊息匯出進行儲存。
背景資訊
當一條訊息初次消費失敗,雲訊息佇列 RocketMQ 版會自動進行訊息重試,達到最大重試次數後,若消費依然失敗,則表明消費者在正常情況下無法正確地消費該訊息。此時,雲訊息佇列 RocketMQ 版不會立刻將訊息丟棄,而是將其發送到該消費者對應的特殊隊列中。更多消費重試原理,請參見訊息重試。
在雲訊息佇列 RocketMQ 版中,這種正常情況下無法被消費的訊息稱為死信訊息(Dead-Letter Message),儲存死信訊息的特殊隊列稱為無效信件佇列(Dead-Letter Queue)。
特性說明
死信訊息具有以下特性:
不會再被消費者正常消費。
有效期間與正常訊息相同,預設為3天,3天后會被自動刪除。因此,請在死信訊息產生後的3天內及時處理。
無效信件佇列具有以下特性:
一個無效信件佇列對應一個Group ID, 而不是對應單個消費者執行個體。
如果一個Group ID未產生死信訊息,雲訊息佇列 RocketMQ 版不會為其建立相應的無效信件佇列。
一個無效信件佇列包含了對應Group ID產生的所有死信訊息,不論該訊息屬於哪個Topic。
雲訊息佇列 RocketMQ 版控制台提供對死信訊息的查詢、匯出和重發的功能。
查詢死信訊息的方式
雲訊息佇列 RocketMQ 版提供的查詢死信訊息的方式對比如下表所示。
查詢方式 | 查詢條件 | 查詢類別 | 說明 |
按Group ID查詢 | Group ID + 時間段 | 範圍查詢 | 根據Group ID和時間範圍,批量擷取合格所有訊息;查詢量大,不易匹配。 |
按Message ID查詢 | Group ID + Message ID | 精確查詢 | 根據Group ID和Message ID可以精確定位任意一條訊息。 |
查詢死信訊息
登入雲訊息佇列 RocketMQ 版控制台,在左側導覽列單擊執行個體列表。
在頂部功能表列選擇地區,如華東1(杭州),然後在執行個體列表中,單擊目標執行個體名稱。
在左側導覽列單擊死信队列,然後在死信队列頁面,選擇以下任一方式查詢死信訊息:
按 Group 查询
根據Group ID和死信訊息產生的時間範圍,批量查詢該Group ID在某段時間內產生的所有死信訊息。
說明死信訊息產生的時間是指一條訊息在投遞重試達到最大次數後被發送到無效信件佇列的時間。
按 Message ID 查询
按Message ID查詢訊息屬於精確查詢。您可以根據Group ID與Message ID精確查詢到任意一條訊息。
匯出死信訊息
若您暫時無法處理死信訊息,可以在雲訊息佇列 RocketMQ 版控制台上將其匯出,以免超過有效期間。
雲訊息佇列 RocketMQ 版控制台提供對死信訊息的單條匯出和大量匯出功能。匯出的檔案格式為CSV。
匯出的訊息內容如下表所示。
訊息欄位 | 欄位含義 |
instanceId | 雲訊息佇列 RocketMQ 版執行個體ID。 |
topic | 訊息所屬的Topic。 |
msgId | 訊息的ID。 |
bornHost | 訊息產生的地址。 |
bornTimestamp | 訊息產生的時間戳記。 |
storeTimestamp | 訊息儲存到雲訊息佇列 RocketMQ 版服務端的時間戳記。 |
reconsumeTimes | 消費失敗的次數。 |
properties | 訊息屬性;JSON格式。 |
body | 訊息體;Base64編碼格式。 |
bodyCRC | 訊息體CRC。 |
單條匯出
在雲訊息佇列 RocketMQ 版控制台按任意方式查詢到死信訊息後,在某條死信訊息的操作列,單擊更多,然後在下拉式清單中,選擇导出消息,匯出該條死信訊息。
大量匯出
在雲訊息佇列 RocketMQ 版控制台按Group ID查詢到死信訊息後,勾選目標死信訊息,然後單擊批量导出消息,匯出所有勾選的死信訊息。
重新發送死信訊息
一條訊息進入無效信件佇列,意味著某些因素導致消費者無法正常消費該訊息,因此,通常需要您對其進行特殊處理。排查可疑因素並解決問題後,您可以在雲訊息佇列 RocketMQ 版控制台重新發送該訊息,讓消費者重新消費一次。
對於順序訊息消費產生的死信訊息,不支援從無效信件佇列重新發送,您需要將訊息從無效信件佇列匯出後自行處理。
死信訊息被重新發送後不會在無效信件佇列中立即被刪除,等到死信訊息的有效期間到期後才會被自動刪除。
單條重發
在雲訊息佇列 RocketMQ 版控制台按任意方式查詢到死信訊息後,在某條死信訊息的操作列,單擊更多,然後在下拉式清單中,選擇重新发送,重發該條死信訊息。
批量重發
在雲訊息佇列 RocketMQ 版控制台按Group ID查詢到死信訊息後,勾選目標死信訊息,然後單擊批量重新发送消息,重新發送所有勾選的死信訊息。
相關文檔
關於消費重試的相關原理,請參見訊息重試。