このトピックでは、ApsaraMQ for RabbitMQ の Exchange の概念と種類について紹介します。Exchange を理解し、選択するのに役立ちます。
Exchange とは
Exchange は、ApsaraMQ for RabbitMQ のメッセージルーティングエージェントです。プロデューサーが ApsaraMQ for RabbitMQ ブローカーにメッセージを送信すると、メッセージは Exchange に送信され、Exchange はメッセージを 1 つ以上のキューにルーティングします。Exchange は、ルーティングキーとヘッダー属性に基づいてメッセージをルーティングします。
ダイレクト Exchange
ルーティングルール
ダイレクト Exchange は、ルーティングキーがメッセージのルーティングキーと完全に一致するキューにメッセージをルーティングします。
シナリオ
ダイレクト Exchange は、メッセージが単純な文字列で区別されるシナリオで使用できます。ほとんどの場合、ダイレクト Exchange はメッセージのユニキャストルーティングに使用されます。
例
次の図は例を示しています。

メッセージ
ルーティングキー
バインディングのルーティングキー
キュー
メッセージ A
img.createimg.createキュー A
メッセージ B
img.logimg.logキュー B
トピック Exchange
ルーティングルール
トピック Exchange は、ルーティングキーがメッセージのルーティングキーと部分的に一致するキューにメッセージをルーティングします。アスタリスク(*)または番号記号(#)は、部分一致をサポートするためにルーティングキーのワイルドカードとして使用されます。アスタリスク(*)は単語を示します。例: cn。番号記号(#)は、ピリオド(.)で区切られたゼロ、1 つ、または複数の単語を示します。例: cn.zj.hz。
シナリオ
トピック Exchange は、メッセージがワイルドカードで区別されるシナリオで使用できます。ほとんどの場合、トピック Exchange はメッセージのマルチキャストルーティングに使用されます。たとえば、トピック Exchange を使用して地理位置データを配信できます。
例
次の図は例を示しています。

メッセージ
ルーティングキー
バインディングのルーティングキー
キュー
メッセージ A
files.cn.hzfiles.cn.hz.#キュー A
メッセージ B
files.cn.hz.storefiles.cn.hz.#files.cn.*.store
キュー A
キュー B
メッセージ C
files.cn.sz.storefiles.cn.*.storeキュー B
ファンアウト Exchange
ルーティングルール
ファンアウト Exchange は、バインドされているすべてのキューにメッセージをルーティングします。ルーティングキーは無視されます。
シナリオ
ファンアウト Exchange は、メッセージのブロードキャストルーティングに最適です。たとえば、配信システムでファンアウト Exchange を使用して、ステータスまたは構成の更新をブロードキャストできます。
例
次の図は例を示しています。

メッセージ
ルーティングキー
バインディングのルーティングキー
キュー
メッセージ A
img.createfiles.cn.hz.#queue.msgText
キュー A
キュー B
メッセージ B
queue.msgMapfiles.cn.hz.#queue.msgText
キュー A
キュー B
メッセージ C
cn.hz.topic.alarmfiles.cn.hz.#queue.msgText
キュー A
キュー B
ヘッダー Exchange
ルーティングルール
ヘッダー Exchange は、特別なダイレクト Exchange と考えることができます。ダイレクト Exchange と同様の方法で動作します。違いは、ヘッダー Exchange はルーティングキーではなくヘッダー属性に基づいてキューにメッセージをルーティングすることです。ヘッダー Exchange をキューにバインドするときは、バインディングのキーと値の形式でバインディング属性を構成する必要があります。ヘッダー Exchange にメッセージを送信するときは、メッセージのキーと値の形式でヘッダー属性を構成する必要があります。ヘッダー Exchange はメッセージを受信した後、メッセージのヘッダー属性とバインドされたキューのバインディング属性の間の一致に基づいてメッセージをルーティングします。
特別なバインディング属性 x-match を使用して、一致方法を決定します。x-match の値は all または any に設定できます。
all: ヘッダー Exchange は、x-match を除くキューのすべてのバインディング属性がメッセージのヘッダー属性と一致する場合にのみ、キューにメッセージをルーティングします。
any: ヘッダー Exchange は、x-match を除くキューの 1 つ以上のバインディング属性がメッセージのヘッダー属性と一致する場合、キューにメッセージをルーティングします。
ヘッダー属性は、次のシナリオでバインディング属性と一致すると見なされます。
ヘッダー属性のキーと値は、バインディング属性のキーと値と同じです。
ヘッダー属性のキーはバインディング属性のキーと同じですが、バインディング属性の値は空です。
シナリオ
ヘッダー Exchange は、メッセージが複数のヘッダー属性で区別されるシナリオで使用できます。ほとんどの場合、ヘッダー Exchange はメッセージのマルチキャストルーティングに使用されます。たとえば、ヘッダー Exchange を使用して、分類またはタグ付けされたニュースを配信できます。
例
次の図は例を示しています。

メッセージ
メッセージのヘッダー属性
バインディングのヘッダー属性
キュー
メッセージ A
type=read resource=group/* type=read */ /* resource=group */ /* x-match=all *//* type=read */ /* resource=topic */ /* x-match=any */
キュー A
キュー B
メッセージ B
type=read/* type=read */ /* resource=topic */ /* x-match=any */キュー B
メッセージ C
type=write resource=topic/* type=read */ /* resource=topic */ /* x-match=any */キュー B
x-delayed-message Exchange
ApsaraMQ for RabbitMQ は、オープンソース RabbitMQ が提供する x-delayed-message Exchange と互換性があります。オープンソース RabbitMQ では、プラグインをインストールすることで x-delayed-message Exchange を使用できます。ApsaraMQ for RabbitMQ で x-delayed-message Exchange を使用するには、プラグインをインストールする必要はありません。x-delayed-message タイプの Exchange を宣言し、メッセージの x-delay ヘッダー属性を設定して、メッセージが配信されるまでの時間を指定するだけです。時間はミリ秒単位です。x-delay ヘッダー属性で指定された時間が経過すると、メッセージは対応するキューに配信されます。
ルーティングルール
x-delayed-message Exchange は、x-delayed-type 拡張属性で指定された Exchange タイプに基づいてルーティングルールを決定します。次のタイプの Exchange は x-delayed-message タイプをサポートしています。
シナリオ
x-delayed-message Exchange は、指定された遅延後にメッセージを配信する必要があるシナリオで使用できます。詳細については、「遅延メッセージ」をご参照ください。
例
x-delayed-message Exchange は、x-delayed-type 拡張属性で指定された Exchange タイプのルーティングルールに基づいてメッセージをルーティングします。次の図は、x-delayed-type 拡張属性が direct に設定されている x-delayed-message Exchange の例を示しています。

メッセージ
x-delay
ルーティングキー
バインディングのルーティングキー
キュー
メッセージ A
3000
img.createimg.createキュー A
メッセージ B
4000
img.logimg.logキュー B
次の項目では、x-delayed-message Exchange がメッセージ A とメッセージ B をルーティングする方法について説明します。
x-delayed-message Exchange がメッセージ A を受信した後、x-delayed-message Exchange は 3,000 ミリ秒後にメッセージ A をキュー A に配信します。
x-delayed-message Exchange がメッセージ B を受信した後、x-delayed-message Exchange は 4,000 ミリ秒後にメッセージ B をキュー B に配信します。
x-consistent-hash Exchange
ApsaraMQ for RabbitMQ は、オープンソース RabbitMQ が提供する x-consistent-hash Exchange と互換性があります。オープンソース RabbitMQ では、プラグインをインストールすることで x-consistent-hash Exchange を使用できます。ApsaraMQ for RabbitMQ で x-consistent-hash Exchange を使用するには、プラグインをインストールする必要はありません。x-consistent-hash タイプの Exchange を宣言するだけです。
x-consistent-hash Exchange は、ハッシュプロパティに基づくメッセージルーティングをサポートしていません。メッセージ ID、相関 ID、またはタイムスタンプを使用してルートを計算することはできません。
ルーティングルール
x-consistent-hash Exchange を使用すると、ルーティングキーまたはヘッダー値に基づいてメッセージをルーティングできます。x-consistent-hash Exchange はメッセージを受信した後、メッセージのルーティングキーまたはヘッダー値に基づいてハッシュ計算を実行し、メッセージのルーティング先のバインドされたキューを決定します。
同じルーティングキーまたはヘッダー値を使用して計算されたハッシュ値は同じです。その結果、同じルーティングキーまたはヘッダー値を使用するメッセージは同じキューにルーティングされます。
ヘッダー値に基づいてメッセージをルーティングする場合は、hash-header パラメーターを使用して Exchange と使用するヘッダーを宣言する必要があります。また、プロデューサーがパブリッシュするメッセージには、hash-header パラメーターで指定されたヘッダーが含まれている必要があります。指定されたヘッダーが含まれていない場合、すべてのメッセージは同じランダムキューにルーティングされます。
ルーティングキーと hash-header パラメーターの両方が指定されている場合、ハッシュ計算は hash-header パラメーターの値に基づいて実行されます。
x-consistent-hash Exchange をキューにバインドするときは、値が 1 ~ 20 のルーティングキーを指定して、キューの重みを表す必要があります。値が大きいほど、重みが大きくなります。重みが大きいほど、Exchange が受信するメッセージが多くなります。
ルーティングキーの値が 20 より大きい場合、重みは 20 と見なされます。
複数のバインディングが存在する場合、値が正の整数である最初のバインディングのみが有効です。キューの重みを変更する前に、既存のバインディングを削除する必要があります。
シナリオ
x-consistent-hash Exchange は、メッセージが重みで分類されるシナリオで使用できます。
例
x-consistent-hash Exchange は、指定された方法を使用して計算されたハッシュ値に基づいて、キューにメッセージをルーティングします。Exchange にバインドされているキューの重みはさまざまで、メッセージは重みに基づいてキューにルーティングされます。次の図は、ルーティングキーに基づいてルーティングルールが計算される x-consistent-hash Exchange の例を示しています。

メッセージ
ルーティングキー
メッセージ A
cn.hz.1
メッセージ B
cn.hz.2
メッセージ C
cn.hz.3
キュー
バインディングのルーティングキー
キュー A
1
キュー B
2
次の項目では、x-consistent-hash Exchange がメッセージ A、メッセージ B、およびメッセージ C をルーティングする方法について説明します。
メッセージ A、メッセージ B、およびメッセージ C が Exchange に到着した後、Exchange はルーティングキーに基づいて計算されたハッシュ値を使用してメッセージをキューに配信します。
Exchange はキュー A とキュー B にバインドされています。キュー A の重みは 1 で、キュー B の重みは 2 です。この場合、メッセージ A、メッセージ B、およびメッセージ C は、1:2 の重み比に基づいてキュー A とキュー B にルーティングされます。