當一條消息初次消費失敗,消息隊列會自動進行消息重試。達到最大重試次數后,若消費依然失敗,則表明消費者在正常情況下無法正確地消費該消息。此時,消息隊列不會立刻將消息丟棄,而是將其發送到該消費者對應的特殊隊列中。在消息隊列中,這種正常情況下無法被消費的消息稱為死信消息(Dead-Letter Message),死信隊列(Dead-Letter Queue)用于存儲及處理這些無法被正常消費的死信消息。
本文通過介紹如何查詢和重新發送進入死信隊列的死信消息,以便您按需管理死信消息,避免消息漏處理。
特性說明
死信隊列
一個死信隊列對應一個 Group ID, 而不是對應單個消費者實例。
如果一個 Group ID 未產生死信消息,消息隊列不會為其創建相應的死信隊列。
一個死信隊列包含了對應 Group ID 產生的所有死信消息,不論該消息屬于哪個 Topic。
死信消息
不會再被消費者正常消費。
有效期與正常消息相同,均為 3 天,3 天后會被自動刪除。因此,請在死信消息產生后的 3 天內及時處理。
查詢死信消息
消息隊列提供以下兩種查詢死信消息的方式:
按 Group ID 查詢:根據 Group ID 和時間范圍,批量獲取符合條件的所有消息;查詢量大,不易匹配。
按 Message ID 查詢:根據 Group ID 和 Message ID 可以精確定位任意一條消息。
按 Group ID 查詢
您可以根據 Group ID 和死信消息產生的時間范圍,批量查詢該 Group ID 在某段時間內產生的所有死信消息。
死信消息產生的時間是指一條消息在投遞重試達到最大次數后被發送到死信隊列的時間。
操作步驟
登錄 SOFAStack 控制臺。
在左側導航欄,選擇 中間件 > 消息隊列 > 死信隊列。
單擊 按 Group ID 查詢。在 Group ID 的輸入框中,輸入關鍵詞搜索想要查找的 Group ID,然后選中,或直接在下拉列表中選擇想要查找的 Group ID。
單擊時間選擇框,選擇想要查詢的時間范圍的起止日期和具體時間點。
單擊 搜索,頁面中會顯示所有符合以上條件的死信消息。
單擊目標死信消息操作列的 消息詳情,即可查看該消息的詳細信息,包括消息體大小、基本屬性等。
單擊目標死信消息操作列中的 消息軌跡,即可進入 消息軌跡 頁面,查詢該消息軌跡。詳見 查詢消息軌跡。
按 Message ID 查詢
按 Message ID 查詢消息屬于精確查詢。您可以根據 Group ID 與 Message ID 精確查詢到任意一條消息。
操作步驟
登錄 SOFAStack 控制臺。
在左側導航欄,選擇 中間件 > 消息隊列 > 死信隊列。
單擊 按 Message ID 查詢,在 Group ID 的輸入框中,輸入關鍵詞搜索想要查找的 Group ID,然后選中,或直接在下拉列表中選擇想要查找的 Group ID。
在 Message ID 的輸入框中,輸入想要查找的消息的 Message ID。
單擊 搜索,頁面中會顯示所有符合以上條件的死信消息。
單擊目標死信消息操作列的 消息詳情,即可查看該消息的詳細信息,包括基本屬性、消息體的下載鏈接等。
單擊目標死信消息操作列中的 消息軌跡,即可進入 消息軌跡 頁面,查詢該消息軌跡。詳見 查詢消息軌跡。
消費驗證
您還可以通過消費驗證功能來驗證指定的消費者應用是否能接受到消息。
消費驗證功能僅僅是用于驗證客戶端的消費邏輯是否正常,并不會影響正常的收消息流程,因此消息的消費狀態等信息在消費驗證后并不會改變。
操作步驟:
在展開的死信消息詳情頁面中,單擊 Group Id 操作列的 消費驗證 。
在消費驗證窗口中,選擇目標消費者應用 IP。
單擊 確定,該消息將會重新發送到指定 IP 上。
重新發送死信消息
一條消息進入死信隊列,意味著某些因素導致消費者無法正常消費該消息,因此,通常需要您對其進行特殊處理。排查可疑因素并解決問題后,您可以在消息隊列控制臺重新發送該消息,讓消費者重新消費一次。
死信消息被重新發送后,不會在死信隊列中被立即刪除。
單條重發在消息隊列控制臺按任意方式查詢到死信消息后,在目標死信消息的操作列,單擊 重新發送,重發該條死信消息。
批量重發在消息隊列控制臺按 Group ID 查詢到死信消息后,勾選目標死信消息,然后單擊頁面下方的 批量重發 ,重新發送所有勾選的死信消息。