【でっどれたーきゅー】

デッドレターキュー とは?

最終更新:
💡 配達不能メッセージの「待合室」

処理に失敗したメッセージや、配信できなかったメッセージを退避させるキュー。原因の調査や、修正後の再処理のためにメッセージを残しておく。

📌 このページのポイント
Dead Letter Queue(DLQ) Producer 送信 Queue Consumer 正常処理 ✓ リトライ失敗 Dead Letter Queue 処理できなかったメッセージ DLQに溜まったメッセージは後から調査・再処理できる
Dead Letter Queue のイメージ
ひよこ ひよこ
なぜDLQが必要なの?
ペンギン先生 ペンギン先生
何度処理しても失敗する「ポイズンメッセージ」があると、再試行のたびに処理能力を使ってしまうし、SQSのFIFOキューのように順番を守るキューでは、同じグループの後ろのメッセージまで進めなくなることがある。DLQに移しておけば、ほかのメッセージの処理を続けながら、失敗したものを後で調べられるんだ。
ひよこ ひよこ
DLQに入ったメッセージはどうする?
ペンギン先生 ペンギン先生
①DLQにメッセージが入ったらアラートで通知、②メッセージの中身やエラーログを見て原因を調査、③直したら元のキューに戻して再処理、④不要なら削除、という流れが基本だよ。SQSには、DLQから元のキューへ戻す「リドライブ」という機能もあるんだ。監視を忘れると、気づかないうちに大量に溜まってしまうから注意しようね。
ひよこ ひよこ
何回失敗したらDLQに送ればいいの?
ペンギン先生 ペンギン先生
決まった正解はないよ。SQSでは受信回数の上限(maxReceiveCount)を自分で決めて、AWSは十分な再試行ができるよう高めに設定することを勧めている。Azure Service Busは既定で10回配信に失敗するとDLQへ移すんだ。少なすぎると一時的なエラーでもすぐDLQに入り、多すぎると問題に気づくのが遅れるから、サービスの性質に合わせて調整しよう。
ひよこ ひよこ
DLQのメッセージをさらに別のDLQに送ることはできる?
ペンギン先生 ペンギン先生
サービス次第だけど、ふつうはやらないよ。たとえばAzure Service BusではDLQのメッセージをさらにデッドレターにはできない。DLQで処理できないものは、人が調べて対応する段階だと考えよう。長く残す必要があるなら、保存期間の設定やS3などへの保管も検討するといいね。
もっと詳しく知りたい人へ

DLQに入ったメッセージは、ずっと残っているの?

サービスによって違うよ。Amazon SQSの標準キューでは、保存期限は元のキューに入った時刻から数えるので、元のキューに1日いたメッセージは、保存期間4日のDLQでは3日後に消える。だからAWSは、DLQの保存期間を元のキューより長くすることを勧めている(FIFOキューでは移動時に時刻がリセットされる)。一方、Azure Service BusのDLQでは有効期限(TTL)が適用されず、自動では削除されないので、取り出して完了させる運用が必要なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「デッドレターキュー」って出てきたら「処理に失敗したメッセージの退避先キュー」と思えればだいたいOK!
📖 おまけ:英語の意味
「Dead Letter Queue (DLQ)」 = 配達不能メッセージキュー
💬 Dead Letter(届けられない手紙)を集める場所。郵便で宛先不明などのため配達できない郵便物を指す言葉から来ているよ

参考資料

← 用語集にもどる