メッセージは、コンシューマーによる拒否、リトライ回数の上限超過、または生存時間 (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 機能は、以下のインスタンスタイプで利用できます。
サーバーレス
Enterprise Edition (サブスクリプション)
Platinum Edition (サブスクリプション)
操作手順
ApsaraMQ for RabbitMQ コンソールのインスタンスリスト ページで、ターゲットインスタンスの名前をクリックします。
インスタンス詳細 ページで、インスタンス制限 タブをクリックします。
デッドレターキューの TTL 機能をサポートしますか の横にある 有効化 をクリックします。
デッドレターのルーティングループを作成しないようにしてください。たとえば、キュー A のデッドレターキューがキュー B で、キュー B のデッドレターキューがキュー A の場合、メッセージは無限にループします。ApsaraMQ for RabbitMQ がこのようなループを検出し、拒否イベントがない場合、ループを停止させるために影響を受けるメッセージの TTL を自動的に無効にします。
デッドレターメッセージは、キュー間で最大 16 回ルーティングできます。この制限に達すると、影響を受けるメッセージの TTL は無効になります。
次のステップ
交換の管理:デッドレター交換の削除や、デッドレターキューとデッドレター交換のバインドを行います。
メッセージの TTL:メッセージに有効期限を設定します。
コンシューマーリトライポリシー:メッセージがデッドレター化される前のリトライ動作を設定します。