デッドレターキュー
処理に失敗したメッセージを退避させ、後から調査・再処理するためのキュー
非同期耐障害性
デッドレターキュー (DLQ) とは
デッドレターキュー (DLQ) は、処理に失敗したメッセージを退避させ、後から調査・再処理するためのキューである。メッセージが失われるのを防ぎ、障害の原因を特定する。
DLQ の仕組み
メッセージの処理が失敗すると、SQS が自動的にリトライする。maxReceiveCount で指定した回数リトライしても成功しない場合、メッセージは DLQ に移動される。DLQ に溜まったメッセージを調査して障害原因を特定し、修正後に元のキューに戻して再処理する。
メッセージ → SQS → Lambda (処理失敗)
→ リトライ 1 回目 (失敗)
→ リトライ 2 回目 (失敗)
→ リトライ 3 回目 (失敗)
→ DLQ に移動
→ DLQ のメッセージを調査・修正・再処理
DLQ vs エラーハンドリング
DLQ とエラーハンドリングの違いを以下にまとめる。
| 観点 | DLQ | try-catch |
|---|---|---|
| 対象 | 非同期メッセージ | 同期処理 |
| リトライ | 自動 (maxReceiveCount) | 手動実装 |
| 調査 | DLQ のメッセージを確認 | ログを確認 |
| 再処理 | DLQ から元のキューに戻す | 再リクエスト |
DLQ の再処理
DLQ の再処理の例を示す。
# DLQ のメッセージを元のキューに戻す
aws sqs start-message-move-task \
--source-arn arn:aws:sqs:ap-northeast-1:123456789012:my-dlq \
--destination-arn arn:aws:sqs:ap-northeast-1:123456789012:my-queue
Lambda の DLQ
Lambda の DLQ を以下にまとめる。
| イベントソース | DLQ の設定場所 |
|---|---|
| SQS トリガー | SQS キューの RedrivePolicy |
| 非同期呼び出し | Lambda の DeadLetterConfig |
| EventBridge | ルールの DLQ |
デッドレターキューの背景や設計思想は関連書籍に詳しい。
この記事は役に立ちましたか?
関連用語
メッセージキュー
プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤
SQS FIFO キュー
メッセージの順序保証と厳密な 1 回配信を提供する Amazon SQS のキュータイプ
Lambda
AWS のサーバーレスコンピューティングサービスで、コードをイベント駆動で実行する
SNS ファンアウト
SNS トピックから複数の SQS キューや Lambda に同時配信し、1 つのイベントで複数の処理を並行実行するパターン
Pub/Sub
発行者と購読者が直接通信せず、メッセージブローカーを介して非同期にメッセージを交換するパターン
エラーメッセージ
プログラムの実行時や構文解析時に問題を検出した際、原因と場所を開発者に伝える通知