メッセージは、コンシューマーによる拒否、リトライ回数の上限超過、または Time-to-Live (TTL) の期限切れなどにより、処理に失敗することがあります。これらのメッセージが失われるのを防ぐため、デッドレターエクスチェンジ (DLX) はこれらのメッセージを捕捉し、調査、再処理、またはアラート通知のために専用のキューにルーティングします。
以下のセクションでは、ApsaraMQ for RabbitMQ の主要な概念、ルーティングプロセス、設定方法、およびデッドレターメッセージのヘッダーについて説明します。
基本概念
| 用語 | 定義 |
|---|---|
| デッドレターエクスチェンジ | デッドレターメッセージを受信し、バインディングキー、ルーティングキー、およびヘッダー属性に基づいてデッドレターキューにルーティングするエクスチェンジです。direct、fanout、topic、headers といった標準的なエクスチェンジタイプはいずれも、デッドレターエクスチェンジとして機能します。 |
| デッドレターのルーティングキー | デッドレターメッセージのルーティングに使用されるルーティングキーです。指定しない場合、メッセージは元のルーティングキーを保持します。 |
| デッドレターメッセージ | デッドレターエクスチェンジに転送されるメッセージです。トリガーの完全なリストについては、「メッセージがデッドレター化されるタイミング」をご参照ください。 |
| デッドレターキュー | デッドレターエクスチェンジにバインドされ、デッドレターメッセージを格納するキューです。 |
メッセージがデッドレター化されるタイミング
以下のいずれかの状況が発生すると、メッセージはデッドレターエクスチェンジに送信されます:
否定応答:コンシューマーが
basic.rejectまたはbasic.nackを呼び出す際に、requeueをfalseに設定した場合。リトライ回数の上限超過:16 回のリトライ試行後もメッセージの消費に失敗した場合。詳細については、「消費リトライポリシー」をご参照ください。
TTL の期限切れ:メッセージが設定されたメッセージ TTL を超えてキューに留まった場合。詳細については、「メッセージの TTL」をご参照ください。
仕組み
プロデューサーがエクスチェンジにメッセージを公開します。
エクスチェンジがメッセージをキューにルーティングします。
コンシューマーがキューからメッセージをプルします。
否定応答、16 回の失敗したリトライ試行、または TTL の期限切れにより、メッセージがデッドレター化されます。
キューは、
x-dead-letter-exchangeで指定されたエクスチェンジに、x-dead-letter-routing-keyで指定されたルーティングキーを使用してデッドレターメッセージを転送します。デッドレターエクスチェンジは、バインドされたデッドレターキューにメッセージをルーティングします。

注意事項
同一 vhost の要件:デッドレターエクスチェンジとそれにバインドされたキューは、同じ vhost 内に存在する必要があります。vhost をまたいだデッドレターのルーティングはサポートされていません。
不変の DLX バインディング:キューがデッドレターエクスチェンジと共に作成されると、その DLX 設定は変更できません。設定を更新するには、キューを削除し、新しい設定で再作成する必要があります。
DLX が未設定の場合:キューにデッドレターエクスチェンジが設定されていない場合、最大配信試行回数 (デフォルトでは 16 回) を超えるとメッセージは永久に削除されます。デッドレターエクスチェンジが設定されている場合、メッセージは対応するデッドレターキューにルーティングされます。
デッドレターエクスチェンジの設定
デッドレターエクスチェンジは、ApsaraMQ for RabbitMQ コンソール、CreateQueue API、またはクライアント SDK を通じて設定します。
コンソール
コンソールでキューを作成する際に、デッドレターエクスチェンジを設定します。
ApsaraMQ for RabbitMQ コンソールにログインします。
概要 ページの リソース分布 セクションで、リージョンを選択します。
インスタンスリスト ページで、ターゲットインスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、キューリスト をクリックします。
キューリスト ページで、この vHost の横にある 切り替え ドロップダウンリストから vhost を選択し、[キューの作成] をクリックします。
[キューの作成] パネルで、次のパラメーターを設定し、[OK] をクリックします。
| パラメーター | 説明 |
|---|---|
| キュー名 | キューの名前です。英字、数字、ハイフン (-)、アンダースコア (_)、ピリオド (.)、シャープ記号 (#)、スラッシュ (/)、アットマーク (@) が使用できます。長さは 1~255 文字です。作成後は変更できません。プレフィックス amq. は予約済みのため使用できません。 |
| [自動削除] | 最後のコンシューマーが登録を解除した後にキューを自動的に削除するかどうかを指定します。有効な値は true、false です。 |
| 詳細設定 | クリックして展開します。デッドレターエクスチェンジと関連設定を構成します: |
| - DeadLetterExchange | このキューからデッドレターメッセージを受信するエクスチェンジです。 |
| - DeadLetterRoutingKey | デッドレターメッセージのルーティングキーです。デッドレターエクスチェンジはこのキーを使用して、一致するデッドレターキューにメッセージをルーティングします。 |
| - MessageTTL | メッセージの TTL (ミリ秒単位) です。この期間内に消費されなかったメッセージはデッドレターメッセージとなり、デッドレターエクスチェンジに転送されます。詳細については、「メッセージの TTL」をご参照ください。 |
API
CreateQueue 操作をデッドレターエクスチェンジのパラメーターと共に呼び出します。詳細については、「CreateQueue」をご参照ください。
クライアント SDK
キューを宣言する際に、キューの引数に x-dead-letter-exchange と x-dead-letter-routing-key を指定します。
以下の Java の例では、some.exchange.name という名前の direct エクスチェンジをデッドレターエクスチェンジとして宣言し、demo-routing-key をデッドレターのルーティングキーとしています:
channel.exchangeDeclare("some.exchange.name", "direct");
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-dead-letter-exchange", "some.exchange.name");
args.put("x-dead-letter-routing-key", "demo-routing-key");
channel.queueDeclare("MyQueue", false, false, false, args);デッドレターメッセージのヘッダー
メッセージがデッドレター化されると、ApsaraMQ for RabbitMQ はイベント履歴を追跡するためにメタデータヘッダーを追加します。
サマリーヘッダー
| ヘッダー | 説明 |
|---|---|
x-first-death-exchange | メッセージが最初にデッドレター化されたときに存在したエクスチェンジです。 |
x-first-death-queue | メッセージが最初にデッドレター化されたときに存在したキューです。 |
x-first-death-reason | メッセージが最初にデッドレター化された理由です。 |
x-death-total | メッセージがデッドレター化された合計回数です。 |
x-death 配列
x-death ヘッダーはエントリの配列で、各エントリは以下のフィールドを持つデッドレターイベントを記録します:
| フィールド | 説明 |
|---|---|
reason | メッセージがデッドレター化された理由です。 |
queue | メッセージがデッドレター化されたときに存在したキューです。 |
exchange | メッセージがデッドレター化される前に公開されたエクスチェンジです。 |
routing-keys | デッドレター化された時点でのメッセージのルーティングキーです。 |
count | この理由でこのキューからメッセージがデッドレター化された回数です。 |
time | メッセージがデッドレター化された日時です。 |
デッドレターの理由の値
| 値 | トリガー |
|---|---|
expired | メッセージの TTL が期限切れになりました。 |
nack | メッセージが requeue を false に設定して否定応答されました。 |
reject | メッセージが requeue を false に設定して拒否されました。 |
Consumption limit exceeded | 16 回のリトライ試行後もメッセージの処理に失敗しました。 |
デッドレターキューの TTL の有効化
デフォルトでは、デッドレターキュー内のメッセージは、キューに TTL が設定されていても期限切れになりません。インスタンスレベルで TTL 機能を有効にすると、デッドレターメッセージがキューの TTL 設定に従うようになります。デッドレターメッセージの TTL が期限切れになると、次に設定されているデッドレターエクスチェンジに転送されます。
サポートされるインスタンスタイプ
デッドレターキューの TTL 機能は、以下のインスタンスタイプで利用できます:
Serverless
Enterprise Edition (サブスクリプション)
Platinum Edition (サブスクリプション)
操作手順
ApsaraMQ for RabbitMQ コンソールのインスタンスリストページで、ターゲットインスタンスの名前をクリックします。
インスタンス詳細 ページで、インスタンス制限 タブをクリックします。
デッドレターキューの TTL 機能をサポートしますか の横にある 有効化 をクリックします。
デッドレターのルーティングループを作成しないようにしてください。例えば、キュー A のデッドレターキューがキュー B で、キュー B のデッドレターキューがキュー A の場合、メッセージは無限にループします。ApsaraMQ for RabbitMQ がこのようなループを検出し、拒否イベントがない場合、ループを停止させるために影響を受けるメッセージの TTL を自動的に無効にします。
デッドレターメッセージは、キュー間で最大 16 回ルーティングできます。この制限に達すると、影響を受けるメッセージの TTL は無効になります。
次のステップ
エクスチェンジの管理:デッドレターエクスチェンジの削除や、デッドレターキューとデッドレターエクスチェンジのバインドを行います。
メッセージの TTL:メッセージに有効期限を設定します。
消費リトライポリシー:メッセージがデッドレター化される前のリトライ動作を設定します。