第12章 ルーティングの設定
ルーティングとは、メッセージが宛先に配信されるプロセスです。そのため、AMQ Interconnect はメッセージルーティングとリンクルーティングの 2 つのルーティングメカニズムを提供します。
- メッセージルーティング
- メッセージルーティングは、デフォルトのルーティングメカニズムです。これにより、メッセージごとにメッセージを直接 (直接ルーティングするメッセージング)、またはブローカーキュー (ブローカー化されたメッセージング) の間でメッセージをルーティングすることができます。
- リンクルーティング
- リンクルートは、送信元と受信側間のプライベートメッセージングパスを表し、ルーターは終了点間でメッセージを渡します。クライアントをサービス (ブローカーキューなど) に接続するために使用できます。
12.1. メッセージルーティングの設定
メッセージルーティングは、デフォルトのルーティングメカニズムです。これにより、メッセージごとにメッセージを直接 (直接ルーティングするメッセージング)、またはブローカーキュー (ブローカー化されたメッセージング) の間でメッセージをルーティングすることができます。
メッセージルーティングでは、以下を実行できます。
12.1.1. メッセージルーティングについて
メッセージルーティングにより、プロデューサーがそれらをルーターに送信するため、メッセージに対してルーティングが実行されます。メッセージがルーターに到達すると、ルーターはメッセージのアドレスおよびルーティングパターンに基づいてメッセージとそのセットをルーティングします。
12.1.1.1. メッセージルーティングのフロー制御
AMQ Interconnect は、クレジットベースのフロー制御メカニズムを使用して、1 つ以上のコンシューマーが受信できる場合にのみプロデューサーをルーターに送信できます。AMQ Interconnect はメッセージを保存しないため、この信用ベースのフロー制御により、コンシューマーが存在しない場合にプロデューサーがメッセージを送信できなくなります。
メッセージをルーターに送信するクライアントは、ルーターがクレジットが含まれるまで待機する必要があります。クレジットなしでメッセージをパブリッシュしようとすると、クライアントはブロックします。クレジットが利用可能になると、クライアントはブロックされず、メッセージはルーターに送信されます。
ほとんどの AMQP クライアントライブラリーを使用すると、プロデューサーで利用できるクレジット量を判断できます。詳細は、クライアントのドキュメントを参照してください。
12.1.1.2. アドレス
アドレスは、メッセージをルーターネットワークを通過する方法を決定します。以下のように、メッセージングネットワークのエンドポイントを指定するアドレス。
- データを使用するエンドポイントプロセス、またはサービスを提供するエンドポイントプロセス
- 複数のコンシューマーと複数のプロデューサーに一致するトピック
メッセージングブローカー内のエンティティー:
- キュー
- 永続トピック
- エクスチェンジ
ルーターがメッセージを受信すると、メッセージのアドレスを使用して、メッセージの送信先を決定します (宛先または 1 つのステップのいずれか、宛先に近いステップのいずれか)。
AMQ Interconnect ではアドレスがモバイルとして見なれば\、アドレスがルーターネットワーク内のルーターに直接接続されていることや、トポロジーの周りにある場合でもアドレスがモバイルである可能性がある点を考慮します。メッセージを複数のコンシューマーにブロードキャストして、または複数のコンシューマーに分散している場合には、アドレスのユーザーはネットワーク上の複数のルーターに接続する場合があります。
通常のルーター操作中にモバイルアドレスを検出したり、管理設定を介して設定したりできます。
12.1.1.3. ルーティングパターン
ルーティングパターンは、モバイルアドレスを持つメッセージがネットワーク全体にかかるパスを定義します。これらのルーティングパターンは直接ルーティングの両方に使用できます。この場合、ルーターはブローカーと間接ルーティングなしでメッセージを分散します。これにより、ルーターはブローカーを介してメッセージを交換できます。
ルーティングパターンは、anycast (Balanced and Closest) と Multicast の 2 つのカテゴリーに分類されます。アドレスには 1 つのコンシューマーのみがある unicast という概念はありません。
キャストディストリビューションは各メッセージを 1 つのコンシューマーに提供しますが、マルチキャストは各メッセージをすべてのコンシューマーに提供します。
各アドレスには、以下のルーティングパターンの 1 つがあります。これは、アドレスを持つメッセージがメッセージングネットワーク全体に分散できるパスを定義します。
- Balanced
複数のコンシューマーが同じアドレスを使用できる任意のキャストメソッド。各メッセージは単一のコンシューマーにのみ提供され、AMQ Interconnect はルーターネットワーク間のトラフィックの負荷を分散しようとします。
複数のコンシューマーが同じアドレスに割り当てられている場合、各ルーターは各パスの現在未設定配信の数を考慮して、どのアウトバウンドパスが存在するかを決定します。これは、配信がより高いレートで設定されるパスと共に配信されることを意味します。
注記AMQ Interconnect は、メッセージセットを計測して、使用するアウトバウンドパスを決定しません。
このシナリオでは、パスの長さに関係なく、メッセージは両方のレシーバーに分散されます。
図12.1 分散メッセージルーティング
- 最寄り
同じアドレスに他のコンシューマーがある場合でも、すべてのメッセージが宛先に到達する短いパスと共に送信されるキャストメソッド。
AMQ Interconnect は、各コンシューマーに到達できるように、トポロジーコストに基づいて最も短いパスを決定します。同じコストが最も低いコンシューマーが複数ある場合、メッセージはこれらのコンシューマー間で均等に分散されます。
このシナリオでは、
Sender
によって送信されたすべてのメッセージがReceiver 1
に送信されます。図12.2 最寄りのメッセージルーティング
- Multicast
メッセージはアドレスにアタッチされたすべてのコンシューマーに送信されます。各コンシューマーはメッセージの 1 つのコピーを受け取ります。
このシナリオでは、すべてのメッセージがすべての受信側に送信されます。
図12.3 マルチキャストメッセージルーティング
12.1.1.4. メッセージセットおよび信頼性
AMQ Interconnect では、以下の信頼性でメッセージを配信できます。
- 少なくとも 1 回
- 少なくとも 1 回
- 一度だけ
信頼性のレベルは、プロデューサーがルーターへのリンクを確立する際に、プロデューサーとルーター間でネゴシエートされます。信頼性のレベルをネゴシエートするために、AMQ Interconnect はすべてのメッセージを事前設定または未設定として扱います。
- 事前設定済み
- fire および forget という名称は、ルーターセットで受信および送信の配信が可能で、セットがメッセージの送信先に伝播されます。ただし、配信を保証しているわけではありません。
- 未設定
AMQ Interconnect は、プロデューサーとコンシューマーの間でセットを伝播します。任意のキャストアドレスの場合、ルーターは受信配信を作成された送信配信に関連付けます。この関連付けに基づいて、ルーターはコンシューマーからプロデューサーに配信状態の変更を伝播します。
マルチキャストアドレスの場合は、ルーターは受信配信をすべてアウトバウンド配信に関連付けます。ルーターは、各コンシューマーが配信の最終状態を設定するのを待機します。すべての送信配信が最終状態になった後に、ルーターは元のインバウンド配信の最終配信状態を維持し、プロデューサーに渡します。
以下の表は、すべてのキャストまたはマルチキャストアドレスに送信される未設定メッセージに対する信頼性の保証を示しています。
最終的な配置 anycast マルチキャスト accepted
コンシューマーはメッセージを受け入れました。
少なくとも 1 つのコンシューマーはメッセージを受け入れますが、コンシューマーは拒否しません。
released
メッセージはその宛先に到達しませんでした。
このメッセージはコンシューマーのいずれかに到達しませんでした。
modified
メッセージはその送信先に達した場合もあります。この配信はインダウト状態のであると見なされ、1 回以上配送が必要な場合に再送信される必要があります。
このメッセージはコンシューマーのいずれの場合でも、アクセスされなかった場合もあります。ただし、コンシューマーが拒否または受け入れられません。
rejected
コンシューマーはメッセージを拒否しました。
少なくとも 1 つのコンシューマーはメッセージを拒否しました。
12.1.2. アドレスセマンティクスの設定
ブローカーを使用せずにクライアント間でメッセージをルーティングできます。ブローカーレスシナリオ (direct-routed メッセージングと呼ばれることもあります) では、AMQ Interconnect はクライアント間でメッセージを直接ルーティングします。
クライアント間でメッセージをルーティングするには、ルーティング分散パターンでアドレスを設定します。ルーターがこのアドレスを持つメッセージを受信すると、メッセージはアドレスのルーティング分散パターンに基づいて宛先または宛先にルーティングされます。
手順
/etc/qpid-dispatch/qdrouterd.conf
設定ファイルでaddress
セクションを追加します。address { prefix: my_address distribution: multicast ... }
prefix
|pattern
アドレス設定を適用するアドレスのアドレスまたはグループ。接頭辞を指定して、アドレスの正確なアドレスまたは開始セグメントと一致するように指定できます。または、ワイルドカードを使用してアドレスに一致するパターンを指定できます。
接頭辞は、
.
または/
文字のいずれかで区切られたアドレス内の正確なアドレスまたは最初のセグメントと一致します。たとえば、接頭辞my_address
は、my_address
とmy_address.1
およびmy_address/1
のアドレスと一致します。ただし、my_address1
と一致しません。パターンは、パターンに対応するアドレスと一致します。パターンは、
.
または/
のいずれかで区切られた単語シーケンスです。ワイルドカード文字を使用して単語を表すことができます。*
文字は 1 つの単語にマッチし、#
文字はゼロ以上の単語のシーケンスと一致します。*
および#
文字はワイルドカードとして予約されています。したがって、メッセージアドレスでは使用しないでください。アドレスパターンの作成に関する詳細は、「アドレスパターンの一致」 を参照してください。
注記prefix
値をpattern
に変換するには 、/#
をそれに追加します。たとえば、接頭辞a/b/c
は、パターンa/b/c/#
と同等です。distribution
メッセージディストリビューションパターン。デフォルトは
balanced
ですが、以下のオプションのいずれかを指定できます。-
balanced
: アドレスに送信されたメッセージは受信側のいずれかにルーティングされ、ルーティングネットワークはセットレートに基づいてトラフィックの負荷のバランスを取ります。 -
closest
: アドレスに送信されたメッセージは、送信先に到達するために最短パスで送信されます。つまり、同じアドレスに複数の受信側がある場合は、最も近いもののみがメッセージを受信します。 multicast
: メッセージはパブリッシュ/サブスクライブモデルのアドレスにアタッチされるすべてのレシーバーに送信されます。メッセージディストリビューションパターンに関する詳細は、「ルーティングパターン」 を参照してください。
-
その他の属性の詳細は、
qdrouterd.conf
の man ページの address を参照してください。アドレスを使用する必要のある他のルーターに同じ
address
セクションを追加します。このルーター設定ファイルに追加した
address
は、このルーターがアドレスに送信されるメッセージを配布する方法のみ制御します。このアドレスにメッセージを分散する必要のあるルーターネットワークに追加のルーターがある場合、設定ファイルに同じaddress
セクションを追加する必要があります。
12.1.3. メッセージ配信の優先順位付けのアドレス設定
アドレスの優先度レベルを設定して、AMQ Interconnect がそのアドレスに送信されるメッセージを処理する方法を制御できます。AMQ Interconnect はコネクションの範囲内で、優先度に基づいてメッセージを処理しようとします。大量のメッセージを処理している接続の場合、優先度の高いメッセージのレイテンシーが短縮されます。
アドレスに高優先度の高いレベルを割り当てると、アドレスに送信されたメッセージが優先度の低いアドレスに送信されることを保証する訳ではありません。ただし、優先順位の高いメッセージは、ルーターネットワークを通じてより迅速に移動します。
メッセージヘッダーに優先度レベルを設定することで、個々のメッセージの優先度レベルを制御することもできます。ただし、アドレスの優先度が優先されます。優先順位を異なるアドレスに優先したメッセージを送信した場合、ルーターはアドレスの優先度レベルを使用します。
手順
/etc/qpid-dispatch/qdrouterd.conf
設定ファイルでアドレスを追加または編集し、優先度レベルを割り当てます。この例では、最も優先度の高いアドレスを追加します。ルーターは、優先度が低いメッセージの前に、このアドレスに送信されたメッセージの配信を試みます。
address { prefix: my-high-priority-address priority: 9 ... }
priority
- このアドレスに送信されたすべてのメッセージに割り当てる優先度レベル。有効な優先度のレベルの範囲は 0-9 で、数字が大きいほど優先度が高くなります。デフォルトでは 4 回です。
関連情報
- メッセージに優先順位レベルを設定する方法は、AMQP 1.0 仕様 を参照してください。
12.1.4. ブローカー化されたメッセージングの設定
ストアおよび転送機能が必要な場合は、AMQ Interconnect をブローカー化されたメッセージングを使用するように設定できます。このシナリオでは、クライアントはルーターに接続してメッセージを送受信し、ルーターはメッセージブローカーのキューとの間でメッセージを送受信します。
以下を設定できます。
メッセージを単一ブローカーでホストされるキューにルーティングしたり、複数のブローカーに分散したシャードキューにメッセージをルーティングしたりできます。
- 非配信可能なメッセージをブローカーキューに保存および取得
12.1.4.1. AMQ Interconnect によるブローカー化されたメッセージングの有効化方法
ブローカー化されたメッセージングにより、AMQ Interconnect はメッセージをブローカーキューに保存できます。これには、ブローカーへの接続、ブローカーキューを表すための方法指定アドレス、およびウェイポイントアドレスにアタッチする自動リンクが必要です。
オートリンクは、ルーターポイントアドレスにアタッチするためにルーターによって自動作成されるリンクです。自動リンクでは、クライアントトラフィックはブローカーではなく、ルーターで処理されます。クライアントはルーターにリンクをアタッチし、ルーターは内部の自動リンクを使用してブローカーのキューに接続します。そのため、ルーターに接続されているクライアントの数にかかわらず、キューは常に単一のプロデューサーと単一のコンシューマーを持ちます。
リンクルーティングとは異なり、自動リンクの使用はメッセージルーティングの形式です。コンシューマーに関連するセマンティクス (例: undeliverable-here=true
変更済み配信状態) を使用する場合は、リンクルーティングを使用することが推奨されます。
図12.4 ブローカー化されたメッセージング
この図では、送信側はルーターに接続し、my_queue にメッセージを送信します。ルーターは、ブローカーに送信リンクを接続し、そのメッセージを my_queue に送信します。後に、受信側はルーターに接続し、my_queue からメッセージを要求します。ルーターは、受信リンクをブローカーに割り当て、my_queue からメッセージを受信し、それらを受信側に提供します。
また、複数の基礎となる物理キューで設定される単一の論理キューであるシャードされたキューにメッセージをルーティングすることもできます。キューのシャーディングを使用すると、複数のブローカーで単一のキューを分散できます。クライアントは、シャードを保持するブローカーに接続してメッセージを送受信できます。
図12.5 シャードキューのあるブローカーメッセージング
この図では、シャーディングされたキュー (my_queue) は 2 つのブローカーに分散されます。ルーターはクライアントと両方のブローカーに接続されている必要があります。送信側はルーターに接続し、そのメッセージを my_queue に送信します。ルーターは各ブローカーに送信リンクを割り当て、各シャードにメッセージを送信します (デフォルトではルーティングの分散は balanced
です)。後に、受信側はルーターに接続し、my_queue からすべてのメッセージを要求します。ルーターは、受信リンクをブローカーのいずれかに割り当て、my_queue からメッセージを受信し、それらを受信側に提供します。
12.1.4.2. ブローカーキューによるメッセージのルーティング
ブローカーキューとの間でメッセージをルーティングし、ルーター経由でキューにアクセスできるクライアントを提供できます。このシナリオでは、クライアントはルーターに接続してメッセージを送受信し、ルーターはブローカーキューとの間でメッセージを送受信します。
メッセージを単一ブローカーでホストされるキューにルーティングしたり、複数のブローカーに分散したシャードキューにメッセージをルーティングしたりできます。
手順
/etc/qpid-dispatch/qdrouterd.conf
設定ファイルで、ブローカーキューのを追加します。ポイントポイントアドレスは、メッセージをルーティングするブローカーのキューを識別します。以下の例では、
my_queue
キューのポイントアドレスを追加します。address { prefix: my_queue waypoint: yes }
prefix
|pattern
メッセージの送信先のブローカーキューに一致するアドレス接頭辞またはパターン。接頭辞を指定して、アドレスの正確なアドレスまたは開始セグメントと一致するように指定できます。または、ワイルドカードを使用してアドレスに一致するパターンを指定できます。
接頭辞は、
.
または/
文字のいずれかで区切られたアドレス内の正確なアドレスまたは最初のセグメントと一致します。たとえば、接頭辞my_address
は、my_address
とmy_address.1
およびmy_address/1
のアドレスと一致します。ただし、my_address1
と一致しません。パターンは、パターンに対応するアドレスと一致します。パターンは、
.
または/
のいずれかで区切られた単語シーケンスです。ワイルドカード文字を使用して単語を表すことができます。*
文字は 1 つの単語にマッチし、#
文字はゼロ以上の単語のシーケンスと一致します。*
および#
文字はワイルドカードとして予約されています。したがって、メッセージアドレスでは使用しないでください。アドレスパターンの作成に関する詳細は、「アドレスパターンの一致」 を参照してください。
注記prefix
値をpattern
に変換するには 、/#
をそれに追加します。たとえば、接頭辞a/b/c
は、パターンa/b/c/#
と同等です。waypoint
-
ルーターがこのアドレスに送信されたメッセージをポイントとして処理するように、この属性を
yes
に設定します。
ルーターをブローカーに接続します。
ブローカーに外向き接続がない場合は、その接続を追加します。
キューが複数のブローカーにシャードされている場合は、各ブローカーの接続を追加する必要があります。詳細は、「外部 AMQP コンテナーへの接続」 を参照してください。
注記ブローカーへの接続に失敗すると、AMQ Interconnect は自動的に接続を再確立し、メッセージ配信を利用可能な別の宛先に再ルーティングしようとします。ただし、一部の配信は
RELEASED
またはMODIFIED
で送信側に返される場合があります。したがって、クライアントがこれらの配信を適切に処理できるようにする必要があります (通常は再送することです)。メッセージをブローカーキューに送信する場合は、送信自動リンクをブローカーキューに追加します。
キューが複数のブローカーにシャードされている場合は、各ブローカーに出力自動リンクを追加する必要があります。
この例では、送信自動リンクを設定し、メッセージをブローカーキューに送信します。
autoLink { address: my_queue connection: my_broker direction: out ... }
address
- ブローカーキューのアドレス。自動リンクが作成されると、このアドレスに割り当てられます。
externalAddress
-
ブローカーキューのオプションの代替アドレス。ブローカーキューが送信者が使用するアドレスとは別のアドレスを持つ必要がある場合、外部アドレスを使用します。このシナリオでは、送信側は
address
アドレスにメッセージを送信し、ルーターはそれらをexternalAddress
アドレスで表されるブローカーキューにルーティングします。 connection
|containerID
-
ルーターによるブローカーへの接続方法。発信接続 (
connection
) またはブローカーのコンテナー ID (containerID
) のいずれかを指定できます。 direction
-
この属性を
out
に設定して、この自動リンクがルーターからブローカーにメッセージを送信できるように指定します。
その他の属性の詳細は、
qdrouterd.conf
の man ページの autoLink を参照してください。
ブローカーキューからメッセージを受信したい場合は、ブローカーキューから受信自動リンクを追加します。
キューが複数のブローカーにシャードされている場合は、各ブローカーに出力自動リンクを追加する必要があります。
この例では、受信自動リンクを設定し、ブローカーキューからメッセージを受信します。
autoLink { address: my_queue connection: my_broker direction: in ... }
address
- ブローカーキューのアドレス。自動リンクが作成されると、このアドレスに割り当てられます。
externalAddress
-
ブローカーキューのオプションの代替アドレス。ブローカーキューが受信者が使用するアドレスとは別のアドレスを持つ必要がある場合、外部アドレスを使用します。このシナリオでは、受信側は
address
アドレスからメッセージを受信し、ルーターはexternalAddres
s アドレスで表されるブローカーキューからメッセージを取得します。 connection
|containerID
-
ルーターによるブローカーへの接続方法。発信接続 (
connection
) またはブローカーのコンテナー ID (containerID
) のいずれかを指定できます。 direction
-
この自動リンクがブローカーからルーターにメッセージを送受信するように指定するには、この属性を
in
に設定します。
その他の属性の詳細は、
qdrouterd.conf
の man ページの autoLink を参照してください。
12.1.4.3. 再配信不可能なメッセージの処理
フォールバック先をポイントする autolinks を設定して、アドレスの配信不可能なメッセージを処理します。フォールバック先 (ブローカーのキューなど) は、どのコンシューマーにも直接ルーティングできないメッセージを保存します。
通常のメッセージの配信中に、AMQ Interconnect はルーターネットワークに接続されているコンシューマーにメッセージを提供します。ただし、コンシューマーに到達できない場合、メッセージはアドレスに設定されたフォールバック宛先に迂回されます (フォールバック先を参照する自動リンクがアクティブである場合)。コンシューマーを再接続し、再度到達すると、フォールバック先に保存されているメッセージを受信します。
AMQ Interconnect は、フォールバック先に保存されたメッセージの元の配信順序を保持します。ただし、コンシューマーが再接続すると、キューのドレインの間に作成された新しいメッセージが、フォールバック先に保存されるメッセージと干渉されます。
前提条件
ルーターはブローカーに接続されている。
詳細は、「外部 AMQP コンテナーへの接続」 を参照してください。
手順
この手順では、アドレスのフォールバックを有効にし、アドレスのフォールバック宛先を提供するブローカーキューに接続するように自動リンクを設定します。
/etc/qpid-dispatch/qdrouterd.conf
設定ファイルで、アドレスのフォールバック宛先を有効にします。address { prefix: my_address enableFallback: yes }
発信自動リンクをブローカーのキューに追加します。
フォールバックを有効にしたアドレスで、メッセージがコンシューマーにルーティング可能でない場合、ルーターはこの自動リンクを使用してメッセージをブローカーのキューに送信します。
autoLink { address: my_address.2 direction: out connection: my_broker fallback: yes }
ルーターネットワークに接続した直後に、ルーターがキューに置かれたメッセージを接続させる場合は、受信自動リンクを追加します。
コンシューマーがルーターに接続するとすぐに、ブローカーキューに保管されたメッセージと、プロデューサーによって送信される新しいメッセージを受信します。キューに格納されたメッセージの元の配信順序は保持されますが、キューに置かれたメッセージは新しいメッセージによってインターリーブされます。
受信自動リンクを追加しない場合、メッセージはブローカーに保存されますが、ルーターに割り当てるとコンシューマーには送信されません。
autoLink { address: my_address.2 direction: in connection: my_broker fallback: yes }
12.1.5. アドレスパターンの一致
一部のルーター設定のシナリオでは、1 つのリテラルアドレスではなく、アドレスの範囲と一致するようにパターンの一致を使用する必要がある場合があります。アドレスのパターンは、パターンに対応するアドレスに一致します。
アドレスパターンは、トークン (通常は 単語) のシーケンスで、.
または /
で区切られています。また、単語を表す特別なワイルドカード文字を含めることもできます。
-
*
1 つの単語を表します。 -
#
ゼロ以上の単語を表します。
例12.1 アドレスパターン
このアドレスには、/
区切り文字で区切られた 2 つのトークンが含まれます。
my/address
例12.2 ワイルドカードを使用したアドレスパターン
このアドレスには 3 つのトークンが含まれます。*
はワイルドカードで、my
および address
の間にある単一の単語を表します。
my/*/address
以下の表は、アドレスパターンと、一致するアドレスの例を示しています。
このパターン | 以下に一致 | 以下には不一致 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|