よろずやIT
プログラミング

デッドレターキューとは?消えるはずのメッセージを取りこぼさない仕組み

執筆・監修:よろずやIT編集部|編集方針を見る

結論:まずここだけ読めばOK

詳しい手順・原因は、この下で解説しています。

プログラミングのイラスト

デッドレターキューとは何か

デッドレターキューとは、システム間でメッセージ(注文情報や通知データなど)をやり取りする仕組みの中で、正常に処理できなかったメッセージを削除せずに退避させておく、専用の保管場所のことです。英語では"Dead Letter Queue"、略して「DLQ」と呼ばれることもあります。

メッセージを使ったシステム連携(メッセージキュー)では、送信側がメッセージを送り、受信側がそれを受け取って処理する、という流れが基本です。しかし、受信側の処理でエラーが起きたり、メッセージの形式がおかしかったりして、どうしても処理できないメッセージが発生することがあります。そうしたメッセージを闇に葬らず、あとで調査できる形で残しておくのが、デッドレターキューの役割です。

「不達郵便」に例えると

郵便物で、宛先が間違っていたり、宛先の建物がすでに存在しなかったりして届けられない場合、その郵便物はゴミとして捨てられるわけではありません。郵便局の「不達郵便」を扱う窓口に集められ、差出人への返送や、原因の確認が行われます。

デッドレターキューも同じ発想です。「届けられなかったメッセージ」を、システムの正常な処理の流れから外に取り分けておくことで、後から「なぜ届かなかったのか」を確認できる状態を保ちます。もしこの仕組みがなければ、失敗したメッセージはそのまま消えてしまい、「何かのデータが処理されずに欠けている」ことにすら気づけなくなってしまいます。

メッセージがデッドレターキューに移されるまでの流れ

  1. 送信側がメッセージをキュー(待ち行列)に送信する
  2. 受信側がメッセージを取り出して処理を試みる
  3. 処理に失敗する(エラー、タイムアウト、形式不正など)
  4. 一定回数のリトライを行っても、なお失敗し続ける
  5. そのメッセージが、通常のキューからデッドレターキューへ移される
  6. 開発者・運用担当者が、デッドレターキューの中身を確認し、原因調査や再送を行う

ポイントは、1回失敗しただけで即座にデッドレターキューへ送るわけではなく、一定回数のリトライを経てもなお失敗する場合に移される、という点です。一時的なネットワークの乱れなどによる失敗であれば、リトライだけで解決することも多いためです。

デッドレターキューがないと、何が起きるか

特に厄介なのが1つ目です。エラーがログに一瞬出るだけで処理自体は次に進んでしまうような構成だと、後から「あの時のあの注文データが処理されていなかった」と気づくのが、ずっと後になってからということも珍しくありません。デッドレターキューは、そうした「静かに消えていく失敗」を可視化する役割も担っています。

運用でよくある悩みどころ

似た仕組みとの違い

以前紹介したサーキットブレーカーパターンが「不調な相手への呼び出し自体を一時的に止める」仕組みであるのに対し、デッドレターキューは「呼び出し(処理)を試みた結果、失敗したものを取り分けておく」仕組みです。どちらも障害への向き合い方という点では共通していますが、片方は「そもそも呼ばない」、もう片方は「呼んだ結果失敗したものを残す」という、異なる場面で使われる考え方です。

こうして見ると

デッドレターキューは、派手な機能ではありませんが、「失敗を見えなくしない」という地味ながら重要な役割を果たす仕組みです。複数のシステムがメッセージをやり取りする構成を扱う際は、正常系だけでなく、この「失敗した時にどう残すか」まで設計に組み込んでおく価値があります。

※ 具体的な実装方法は、使用しているメッセージキューサービス(Amazon SQS、RabbitMQ、Azure Service Busなど)によって設定方法が異なるため、詳しくは各公式ドキュメントもあわせてご確認ください。

PR【中古】 1からはじめるITアーキテクチャー構築入門 システム設計の基礎から実践まで/二上哲也(著者),田端真由美(著者)

【中古】 1からはじめるITアーキテクチャー構築入門 システム設計の基礎から実践まで/二上哲也(著者),田端真由美(著者)

¥2,480

楽天で見る
SHAREXLINEはてブ

よくある質問

Q.デッドレターキューは、どんなシステムでも必要ですか?

A.特に重要になるのは、複数のシステム間でメッセージやデータをやり取りする構成(注文処理、通知配信、バッチ処理など)です。1つのプログラム内で完結する処理では、優先度は下がります。

Q.デッドレターキューに溜まったメッセージは、放置しても問題ないですか?

A.放置は避けるべきです。デッドレターキューは『失敗の記録』でもあるため、定期的に中身を確認し、原因を調査して再送するか、恒久的に処理不能と判断して破棄するかを決める運用が必要です。放置すると、失敗が起きていること自体に誰も気づけなくなります。

Q.リトライ(再試行)があれば、デッドレターキューは不要ですか?

A.リトライだけでは不十分です。データ形式の誤りなど、何度リトライしても成功しない『恒久的な失敗』も存在します。そうしたメッセージを無限にリトライさせ続けるのではなく、一定回数で見切りをつけてデッドレターキューに移す、という組み合わせが一般的です。

関連記事

最新のIT関連書籍 トップ10

PR / 楽天市場の売れ筋ランキングを定期的に取得しています。価格は変動する場合があるため、購入前に各ストアでご確認ください。