すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for RabbitMQ:デッドレター交換

最終更新日:Aug 07, 2026

メッセージは、コンシューマーによる拒否、リトライ回数の上限超過、または生存時間 (TTL) の期限切れなど、さまざまな理由で失敗することがあります。これらのメッセージを失う代わりに、デッドレター交換 (DLX) がそれらをキャプチャし、調査、再処理、またはアラート通知のための専用キューにルーティングします。

以降のセクションでは、ApsaraMQ for RabbitMQ の基本概念、ルーティングプロセス、設定方法、およびデッドレターメッセージヘッダーについて説明します。

基本概念

用語定義
デッドレター交換デッドレターメッセージを受信し、バインディングキー、ルーティングキー、およびヘッダー属性に基づいてデッドレターキューにルーティングする交換です。direct、fanout、topic、headers などの標準的な交換タイプは、すべてデッドレター交換として機能します。
デッドレターのルーティングキーデッドレターメッセージのルーティングに使用されるルーティングキーです。指定しない場合、メッセージは元のルーティングキーを保持します。
デッドレターメッセージデッドレター交換に転送されるメッセージです。トリガーの完全なリストについては、メッセージがデッドレター化されるタイミングをご参照ください。
デッドレターキューデッドレター交換にバインドされ、デッドレターメッセージを格納するキューです。

メッセージがデッドレター化されるタイミング

メッセージは、次のいずれかが発生したときにデッドレター交換に送信されます。

  • 否定応答:コンシューマーが basic.reject または basic.nack を呼び出す際に、requeuefalse に設定した場合。

  • リトライ回数の上限超過:メッセージが 16 回のリトライ試行後もコンシュームに失敗した場合。詳細については、コンシューマーリトライポリシーをご参照ください。

  • TTL の期限切れ:メッセージが設定されたメッセージ TTL を超えてキューに留まった場合。詳細については、メッセージの TTLをご参照ください。

仕組み

  1. プロデューサーが交換にメッセージを公開します。

  2. 交換がメッセージをキューにルーティングします。

  3. コンシューマーがキューからメッセージをプルします。

  4. メッセージがデッドレター化されます (否定応答、16 回の失敗したリトライ試行、または TTL の期限切れによる)。

  5. キューは、x-dead-letter-exchange で指定された交換にデッドレターメッセージを転送します。このとき、x-dead-letter-routing-key で指定されたルーティングキーが使用されます。

  6. デッドレター交換がメッセージをバインドされたデッドレターキューにルーティングします。

Dead-letter message routing flow

注意事項

  • 同一 vhost の要件:デッドレター交換とそれにバインドされたキューは、同じ vhost 内に存在する必要があります。vhost をまたいだデッドレターのルーティングはサポートされていません。

  • 不変の DLX バインディング:キューがデッドレター交換とともに作成されると、その DLX 設定は変更できません。設定を更新するには、キューを削除し、新しい設定で再作成する必要があります。

  • DLX が未設定の場合:キューにデッドレター交換が設定されていない場合、メッセージは最大配信試行回数 (デフォルトで 16 回) を超えると完全に削除されます。デッドレター交換が設定されている場合、メッセージは対応するデッドレターキューにルーティングされます。

デッドレター交換の設定

デッドレター交換は、ApsaraMQ for RabbitMQ コンソール、CreateQueue API、またはクライアント SDK を通じて設定します。

コンソール

コンソールでキューを作成する際に、デッドレター交換を設定します。

  1. ApsaraMQ for RabbitMQ のコンソールにログインします。

  2. 概要 ページの リソース分布 セクションで、リージョンを選択します。

  3. インスタンスリスト ページで、ターゲットインスタンスの名前をクリックします。

  4. 左側のナビゲーションウィンドウで、キューリスト をクリックします。

  5. キューリスト ページで、この vHost の横にある 切り替え ドロップダウンリストから vhost を選択し、[キューの作成] をクリックします。

  6. [キューの作成] パネルで、次のパラメーターを設定し、[OK] をクリックします。

パラメーター説明
キュー名キューの名前。文字、数字、ハイフン (-)、アンダースコア (_)、ピリオド (.)、番号記号 (#)、スラッシュ (/)、アットマーク (@) を使用できます。長さは 1~255 文字です。作成後は変更できません。プレフィックス amq. は予約済みのため使用できません。
自動削除最後のコンシューマーが登録を解除した後にキューを自動的に削除するかどうか。有効な値は truefalse です。
詳細設定クリックして展開します。デッドレター交換と関連設定を構成します。
- DeadLetterExchangeこのキューからデッドレターメッセージを受信する交換。
- DeadLetterRoutingKeyデッドレターメッセージのルーティングキー。デッドレター交換はこのキーを使用して、一致するデッドレターキューにメッセージをルーティングします。
- MessageTTLメッセージの TTL (ミリ秒単位)。この期間内にコンシュームされなかったメッセージはデッドレターメッセージとなり、デッドレター交換に転送されます。詳細については、メッセージの TTL をご参照ください。

API

CreateQueue 操作をデッドレター交換のパラメーターとともに呼び出します。詳細については、CreateQueue をご参照ください。

クライアント SDK

キューを宣言する際に、キューの引数で x-dead-letter-exchangex-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メッセージが requeuefalse に設定して否定応答された。
rejectメッセージが requeuefalse に設定して拒否された。
Consumption limit exceededメッセージが 16 回のリトライ試行後に失敗した。

デッドレターキューの TTL の有効化

デフォルトでは、デッドレターキュー内のメッセージは、キューに TTL が設定されていても期限切れになりません。インスタンスレベルで TTL 機能を有効にすると、デッドレターメッセージがキューの TTL 設定に従うようになります。デッドレターメッセージの TTL が期限切れになると、次に設定されているデッドレター交換に転送されます。

サポートされるインスタンスタイプ

デッドレターキューの TTL 機能は、以下のインスタンスタイプで利用できます。

  • サーバーレス

  • Enterprise Edition (サブスクリプション)

  • Platinum Edition (サブスクリプション)

操作手順

  1. ApsaraMQ for RabbitMQ コンソールのインスタンスリスト ページで、ターゲットインスタンスの名前をクリックします。

  2. インスタンス詳細 ページで、インスタンス制限 タブをクリックします。

  3. デッドレターキューの TTL 機能をサポートしますか の横にある 有効化 をクリックします。

重要
  • デッドレターのルーティングループを作成しないようにしてください。たとえば、キュー A のデッドレターキューがキュー B で、キュー B のデッドレターキューがキュー A の場合、メッセージは無限にループします。ApsaraMQ for RabbitMQ がこのようなループを検出し、拒否イベントがない場合、ループを停止させるために影響を受けるメッセージの TTL を自動的に無効にします。

  • デッドレターメッセージは、キュー間で最大 16 回ルーティングできます。この制限に達すると、影響を受けるメッセージの TTL は無効になります。

次のステップ