4.22. アドレスおよびキューのフェデレーション
フェデレーションにより、ブローカーを共通のクラスターに入れることなく、ブローカー間のメッセージの転送が可能になります。ブローカーはスタンドアロンまたは個別のクラスターになります。さらに、ソースおよびターゲットブローカーはさまざまな管理ドメインに配置できます。つまり、ブローカーには異なる設定、ユーザー、およびセキュリティー設定を指定できます。ブローカーは、異なるバージョンの AMQ Broker を使用している場合もあります。
たとえば、フェデレーションは、メッセージをあるクラスターから別のクラスターへ確実に送信するのに適しています。この送信は、大規模なエリアネットワーク (WAN)、クラウドインフラストラクチャーの リージョン、またはインターネット上である可能性があります。ソースブローカーからターゲットブローカーへの接続が失われた場合 (ネットワーク障害などの理由により)、ソースブローカーはターゲットブローカーがオンラインに戻るまで接続を再確立しようとします。ターゲットブローカーがオンラインに戻ると、メッセージ送信が再開します。
管理者は、アドレスポリシーおよびキューポリシーを使用してフェデレーションを管理できます。ポリシー設定は特定のアドレスまたはキューに一致させることができます。また、ポリシーには、アドレスまたは キューのセットに対して設定に一致するワイルドカード式を含めることができます。そのため、フェデレーションは、一致するセットからキューまたはアドレスが追加されるか、削除されるため、動的に適用できます。ポリシーには、特定のアドレスやキューを含む、または除外する 複数の式を含めることができます。さらに、複数のポリシーをブローカーまたはブローカークラスターに適用できます。
AMQ Broker では、2 つの主なフェデレーションオプションは アドレスフェデレーション と キューフェデレーションです。これらのオプションは、これ以降のセクションで説明します。
ブローカーには、フェデレーションされたコンポーネントおよびローカルのみのコンポーネントの設定を含めることができます。つまり、ブローカーでフェデレーションを設定する場合は、そのブローカーですべてをフェデレーションする必要はありません。
4.22.1. アドレスフェデレーションについて
アドレスのフェデレーションは、接続されたブローカー間の完全なマルチキャスト分散パターンと似ています。たとえば、BrokerA
のアドレスに送信されたすべてのメッセージは、そのブローカーのすべてのキューに送信されます。さらに、各メッセージは BrokerB
および割り当てられたすべてのキューに配信されます。
アドレスフェデレーションは、ブローカーを動的にリモートブローカーのアドレスにリンクします。たとえば、ローカルブローカーがリモートブローカーのアドレスからメッセージをフェッチする場合は、リモートアドレスにキューが自動的に作成されます。その後、リモートブローカーのメッセージはこのキューによって使用されます。最後に、メッセージは最初にローカルアドレスに直接公開されていましたが、メッセージはローカルブローカーの対応するアドレスにコピーされます。
フェデレーションがアドレスを作成できるように、リモートブローカーを再設定する必要はありません。ただし、ローカルブローカーにはリモートアドレスへのアクセス許可を付与する 必要があります。
4.22.2. アドレスフェデレーションの一般的なトポロジー
アドレスフェデレーションを使用する一般的なトポロジーの一部を以下に示します。
- 対称トポロジー
対称トポロジーでは、プロデューサーとコンシューマーは各ブローカーに接続されます。キューとそのコンシューマーは、いずれかのプロデューサーによって公開されるメッセージを受信できます。対称トポロジーの例を以下に示します。
図4.5 対称トポロジーにおけるアドレスフェデレーション
対称トポロジーのアドレスフェデレーションを設定する場合は、アドレスポリシーの
max-hops
プロパティーの値を1
に設定することが重要です。これにより、メッセージが 1 回だけ コピーされ、cyclic レプリケーションは回避されます。このプロパティーを大きな値に設定すると、コンシューマーは同じメッセージの複数のコピーを受け取ります。- 完全なメッシュトポロジー
完全なメッシュトポロジーは対称設定と似ています。3 つ以上のブローカーは相互に対称的に分散し、完全なメッシュを作成します。この設定では、プロデューサーとコンシューマーは各ブローカーに接続されます。キューとそのコンシューマーは任意のプロデューサーによって公開されるメッセージを受信できます。このトポロジーの例を以下に示します。
図4.6 完全なメッシュトポロジーにおけるアドレスフェデレーション
対称設定の場合、完全なメッシュトポロジーのアドレスフェデレーションを設定する場合は、アドレスポリシーの
max-hops
プロパティーの値を1
に設定することが重要です。これにより、メッセージが 1 回だけ コピーされ、cyclic レプリケーションは回避されます。- リングトポロジー
ブローカーのリングでは、各フェデレーションされたアドレスは、リング内の 1 つだけに対してアップストリームになります。このトポロジーの例を以下に示します。
図4.7 リングトポロジーにおけるアドレスフェデレーション
リングトポロジーのフェデレーションを設定する場合は、循環レプリケーションを回避するために、アドレスポリシーの
max-hops
プロパティーをn-1
の値に設定することが重要です。ここで、nはリング内のノード数になります。たとえば、上記のリングトポロジーでは、max-hops
の値は5
に設定されます。これにより、リング内のすべてのアドレスがメッセージが 1 度だけ 見えるようになります。リングトポロジーの利点は、必要な物理接続の数において、チャイルがセットアップすることです。ただし、このタイプのトポロジーの欠点は、1 つのブローカーが失敗した場合にリング全体が失敗することです。
- fan-out トポロジー
ファンアウトトポロジーでは、単一のマスターアドレスはフェデレーションされたアドレスのツリーによってリンクされます。マスターアドレスに公開されたすべてのメッセージは、ツリー内の任意のブローカーに接続しているすべてのコンシューマーによって受信できます。ツリーは、深さに設定できます。ツリー内に既存のブローカーを再設定しなくても、ツリーを拡張することもできます。このトポロジーの例を以下に示します。
図4.8 ファンアウトトポロジーでのアドレスフェデレーション
ファンアウトトポロジーのフェデレーションを設定する場合は、アドレスポリシーの
max-hops
プロパティーをn-1
の値に設定します。ここで、n ツリー内のレベル数になります。たとえば、上記の fan-out トポロジーでは、max-hops
の値は2
に設定されます。これにより、ツリー内のすべてのアドレスがメッセージが 1 度だけ 見えるようになります。
4.22.3. アドレスフェデレーション設定での迂回バインディングのサポート
アドレスフェデレーションを設定する際に、アドレスポリシー設定に迂回バインディングのサポートを追加できます。このサポートを追加すると、フェデレーションが迂回バインディングに応答し、リモートブローカーの指定のアドレスのフェデレーションされたコンシューマーを作成できます。
たとえば、test.federation.source
というアドレスがアドレスポリシーに含まれ、test.federation.target
という別のアドレスが含まれていない場合は、通常、キューが test.federation.target
に作成されると、アドレスポリシーの一部ではないため、フェデレーションされたコンシューマーが作成されません。ただし、test.federation.source がソースアドレスで
test.federation.target
が転送アドレスに、永続コンシューマーを作成すると、転送アドレスに永続コンシューマーが作成されます。ソースアドレスは引き続き multicast
ルーティングタイプを使用する必要がありますが、ターゲットアドレスは multicast
または anycast
を使用できます。
ユースケースの例は、JMS トピック (multicast
アドレス) を JMS キュー (anycast
アドレス) にリダイレクトする迂回です。これにより、JMS 2.0 および共有サブスクリプションをサポートしないレガシーコンシューマーのトピックへのメッセージの負荷分散が可能になります。
4.22.4. フェデレーションの設定
Core プロトコル、または 7.12 以降では AMQP を使用して、アドレスとキューのフェデレーションを設定できます。フェデレーションに AMQP を使用すると、次の利点が得られます。
- クライアントがメッセージングに AMQP を使用する場合、フェデレーションに AMQP を使用すると、AMQP と Core プロトコル間のメッセージの変換 (およびその逆) が不要になります。この変換は、フェデレーションで Core プロトコルを使用する場合に必要です。
- AMQP フェデレーションは、単一の送信接続を介した双方向フェデレーションをサポートします。これにより、リモートブローカーがローカルブローカーに接続する必要がなくなります。これは、フェデレーションに Core プロトコルを使用する場合の要件であり、ネットワークポリシーによって禁止される可能性があります。
4.22.4.1. AMQP を使用したフェデレーションの設定
AMQP を使用したアドレスおよびキューのフェデレーションを設定するには、次のポリシーを使用できます。
- ローカルアドレスポリシーは、アドレスの要求を監視するようにローカルブローカーを設定します。要求が存在する場合は、リモートブローカー上の一致するアドレスに対してフェデレーテッドコンシューマーを作成して、メッセージをローカルブローカーにフェデレーションします。
- リモートアドレスポリシーは、アドレスの要求を監視するようにリモートブローカーを設定します。要求が存在する場合は、ローカルブローカー上の一致するアドレスに対してフェデレーテッドコンシューマーを作成して、メッセージをリモートブローカーにフェデレーションします。
- ローカルキューポリシーは、キューの要求を監視するようにローカルブローカーを設定します。要求が存在する場合は、リモートブローカーの一致するキューに対してフェデレーテッドコンシューマーを作成して、メッセージをローカルブローカーにフェデレーションします。
- リモートキューポリシーは、キューの要求を監視するようにリモートブローカーを設定します。要求が存在する場合は、ローカルブローカーの一致するキューに対してフェデレーテッドコンシューマーを作成して、メッセージをリモートブローカーにフェデレーションします。
リモートアドレスポリシーとリモートキューポリシーは、リモートブローカーに送信され、リモートブローカー上のローカルポリシーとなり、リバースフェデレーション接続を提供します。リバースフェデレーション接続にポリシーを適用する場合、ポリシーを受信したブローカーがローカルブローカーとなり、ポリシーを送信したブローカーがリモートブローカーとなります。ローカルブローカー上にリモートアドレスポリシーとリモートキューポリシーを設定すると、すべてのフェデレーション設定を 1 つのブローカーに保持できます。これは、たとえばハブアンドスポークトポロジーの場合に便利なアプローチです。
4.22.4.1.1. AMQP を使用したアドレスフェデレーションの設定
AMQP を使用したアドレスフェデレーションを設定するには、<broker-connections>
要素を使用します。
前提条件
<amqp-connection>
要素で指定されたユーザーに、リモートブローカー上の一致するアドレスとキューに対する読み取りおよび書き込みパーミッションがある。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 <amqp-connection>
要素を含む<broker connections>
要素を追加します。<amqp-connection>
要素で、リモートブローカーの接続詳細を指定し、フェデレーション設定に名前を割り当てます。以下に例を示します。<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
<federation>
要素を追加し、次のいずれかまたは両方を含めます。-
リモートブローカーからローカルブローカーにメッセージをフェデレーションするための
<local-address-policy>
要素。 -
ローカルブローカーからリモートブローカーにメッセージをフェデレーションするための
<remote-address-policy>
要素。
次の例は、ローカルアドレスポリシーとリモートアドレスポリシーの両方を含む federation 要素を示しています。
<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> <federation> <local-address-policy name="example-local-address-policy" auto-delete="true" auto-delete-delay="1" auto-delete-message-count="2" max-hops="1" enable-divert-bindings="true"> <include address-match="queue.news.#" /> <include address-match="queue.bbc.news" /> <exclude address-match="queue.news.sport.#" /> </local-address-policy> <remote-address-policy name="example-remote-address-policy"> <include address-match="queue.usatoday" /> </remote-address-policy> </federation> </amqp-connection> </broker-connections>
ローカルアドレスポリシーとリモートアドレスポリシーの両方で同じパラメーターを設定できます。有効なパラメーターは次のとおりです。
- name
-
アドレスポリシーの名前。すべてのアドレスポリシー名が、
<broker-connections>
要素内の<federation>
要素内で一意である必要があります。 - max-hops
-
フェデレーション中にメッセージが実行できるホップの最大数。デフォルト値の
0
は、ほとんどの単純なフェデレーションデプロイメントに適しています。ただし、トポロジーによっては、メッセージのループを防ぐために、より大きな値が必要になる場合があります。 - auto-delete
-
アドレスフェデレーションでは、メッセージがフェデレーション統合されるブローカー上に永続キューが作成されます。このパラメーターを true に設定すると、開始ブローカーが切断され、遅延およびメッセージ数のパラメーターが満たされたときにキューが自動的に削除されるようにマークされます。動的に作成されたキューのクリーンアップを自動化する場合に便利なオプションです。デフォルト値は
false
です。これは、キューが自動的に削除されないことを意味します。 - auto-delete-delay
-
開始ブローカーが切断された後、作成されたキューが自動的に削除されるまでの時間 (ミリ秒単位)。デフォルト値は
0
です。 - auto-delete-message-count
-
キューを自動的に削除する前に、キューのメッセージ数がこの値以下である必要があります。デフォルト値は
0
です。 - enable-divert-bindings
-
true
に設定すると、要求に応じて迂回バインディングをリッスンできるようになります。アドレスを持つ迂回バインディングがアドレスポリシーに含まれるアドレスと一致する場合、迂回の転送アドレスと一致するキューバインディングによって要求が作成されます。デフォルト値はfalse
です。 - include
ポリシーに含めるアドレスに一致するアドレス一致パターン。複数のパターンを指定できます。パターンを指定しなかった場合、すべてのアドレスがポリシーに含まれます。
正確なアドレス (例:
queue.bbc.news)
を指定できます。または、ワイルドカード文字である番号記号 (#) を使用して、一致するアドレスのセットを指定することもできます。上記の例では、ローカルアドレスポリシーに、queue.news
文字列で始まるすべてのアドレスも含まれます。- exclude
ポリシーから除外するアドレスに一致するアドレス一致パターン。複数のパターンを指定できます。パターンを指定しなかった場合、ポリシーからアドレスは除外されません。
正確なアドレス (例:
queue.bbc.news)
を指定できます。または、ワイルドカード文字である番号記号 (#) を使用して、一致するアドレスのセットを指定することもできます。上記の例では、ローカルアドレスポリシーから、queue.news.sport
文字列で始まるすべてのアドレスが除外されます。
-
リモートブローカーからローカルブローカーにメッセージをフェデレーションするための
4.22.4.1.2. AMQP を使用したキューフェデレーションの設定
手順
AMQP のキューフェデレーションを設定するには、<broker connections>
要素を使用します。
前提条件
<amqp-connection>
要素で指定されたユーザーに、リモートブローカー上の一致するアドレスとキューに対する読み取りおよび書き込みパーミッションがある。
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 <amqp-connection>
要素を含む<broker connections>
要素を追加します。<amqp-connection>
要素で、リモートブローカーの接続詳細を指定し、フェデレーション設定に名前を割り当てます。以下に例を示します。<broker-connections> <amqp-connection uri="tcp://<__HOST__>:<__PORT__>" user="federation_user" password="federation_pwd" name="queue-federation-example"> </amqp-connection> </broker-connections>
<federation>
要素を追加し、次のいずれかまたは両方を含めます。-
リモートブローカーからローカルブローカーにメッセージをフェデレーションするための
<local-queue-policy>
要素。 -
ローカルブローカーからリモートブローカーにメッセージをフェデレーションするための
<remote-queue-policy>
要素。
次の例は、ローカルキューポリシーを含む federation 要素を示しています。
<broker-connections> <amqp-connection uri="tcp://HOST:PORT" name="federation-example"> <federation> <local-queue-policy name="example-local-queue-policy"> <include address-match="#" queue-match="#.remote" /> <exclude address-match="#" queue-match="#.local" /> </local-queue-policy> </federation> </amqp-connection> </broker-connections>
- name
-
キューポリシーの名前。すべてのキューポリシー名が、
<broker-connections>
要素の<federation>
要素内で一意である必要があります。 - include
-
アドレスと一致する
address-match
パターンと、ポリシーに含めるアドレスの特定のキューと一致するqueue-match
パターン。queue-match
パラメーターには、address-match
パラメーターと同様に、正確な名前を指定することも、ワイルドカード表現を使用してキューのセットを指定することもできます。上記の例では、すべてのアドレスの.remote
という文字列に一致するキューが含まれます。これはaddress-match
の値#
で表されます。 - exclude
-
アドレスと一致する
address-match
パターンと、ポリシーから除外するアドレスの特定のキューと一致するqueue-match
パターン。queue-match
パラメーターには、address-match
パラメーターと同様に、正確な名前を指定することも、ワイルドカード表現を使用してキューのセットを指定することもできます。上記の例では、すべてのアドレスの.local
という文字列に一致するキューが除外されます。これはaddress-match
の値#
で表されます。 - priority-adjustment
-
同じキュー上の他のローカルコンシューマーよりも優先度の値が低くなるように、フェデレーテッドコンシューマーの値を調整します。デフォルト値は
-1
です。この値にすると、ローカルコンシューマーがフェデレーテッドコンシューマーよりも優先されます。 - include-federated
このパラメーターの値を
false
に設定すると、設定は、すでにフェデレーションされたコンシューマー (つまりフェデレーションされたキューのコンシューマー) は統合しなおされません。これにより、対称トポロジーまたは閉ループトポロジーで、非フェデレーテッドコンシューマーが存在せず、メッセージがシステム内を際限なく流れるという状況が回避されます。閉ループトポロジーがない場合は、このパラメーターの値を
true
に設定できます。たとえば、3 つのブローカー、BrokerA、BrokerB、および BrokerC のチェーンがあり、プロデューサーが BrokerA のコンシューマーと BrokerC のコンシューマーがあるとします。この場合、BrokerB がコンシューマーを BrokerA にフェデレーションしなおす必要があります。
-
リモートブローカーからローカルブローカーにメッセージをフェデレーションするための
4.22.4.2. Core プロトコルを使用したフェデレーションの設定
Core プロトコルを使用するようにメッセージとキューのフェデレーションを設定できます。
4.22.4.2.1. ブローカークラスターのフェデレーションの設定
以下のセクションの例では、standaloneローカルブローカーとリモートブローカーとの間でアドレスとキューのフェデレーションを設定する方法について示しています。スタンドアロンブローカー間のフェデレーションの場合、フェデレーション設定の名前、およびアドレスおよびキューポリシー名はローカルブローカーとリモートブローカー間で一意である必要があります。
ただし、clusterでブローカーのフェデレーションを設定する場合は、追加の要件があります。クラスター化されたブローカーの場合、フェデレーション設定の名前、およびその設定内のすべてのアドレスおよびキューポリシーの名前は、そのクラスター内のすべてのブローカーで 同じである必要があります。
同じクラスター内のブローカーが同じフェデレーション設定とアドレスおよびキューポリシー名を使用するようにすることで、メッセージの重複を回避できます。たとえば、同じクラスター内のブローカーが 異なる フェデレーション設定名を持っている場合、同じアドレスに対して複数の異なる名前の転送キューが作成され、ダウンストリームのコンシューマーに対してメッセージが重複する可能性があります。対照的に、同じクラスター内のブローカーが 同じ フェデレーション設定名を使用する場合、これは基本的に、ダウンストリームのコンシューマーに負荷分散される、複製されたクラスター化された転送キューを作成します。これにより、メッセージの重複を回避できます。
4.22.4.2.2. アップストリームのアドレスフェデレーションの設定
以下の例は、スタンドアロンブローカー間でアップストリームのアドレスフェデレーションを設定する方法を示しています。この例では、ローカル (つまりダウンストリーム) ブローカーから一部のリモート (つまりアップストリーム) ブローカーへのフェデレーションを設定します。
前提条件
- 以下の例は、スタンドアロンブローカー間でアドレスフェデレーションを設定する方法を示しています。ただし、ブローカー クラスター のフェデレーションを設定するための要件も理解している必要があります。詳細は、「ブローカークラスターのフェデレーションの設定」 を参照してください。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 <federation>
要素が含まれる新しい<federations >
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
name
- フェデレーション設定の名前。この例では、名前はローカルブローカーの名前に対応します。
user
- アップストリームブローカーに接続するための共有ユーザー名。
password
- アップストリームブローカーに接続するための共有パスワード。
注記ユーザーとパスワードの認証情報がリモートブローカーごとに異なる場合は、設定に追加する時にこれらのブローカーの認証情報を個別に指定できます。これは、この手順の後半で説明します。
federation
要素内に<address-policy>
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> </address-policy> </federation> </federations>
name
- アドレスポリシーの名前。ブローカーに設定されるアドレスポリシーはすべて一意の名前を指定する必要があります。
auto-delete
-
アドレスのフェデレーション時に、ローカルブローカーはリモートアドレスに永続キューを動的に作成します。
auto-delete
プロパティーの値は、ローカルブローカーの切断後にリモートキューを削除するかどうかを指定します。また、auto-delete-delay
およびauto- delete-message-count
プロパティーの値も到達するかどうかを指定します。動的に作成されたキューのクリーンアップを自動化する場合に便利なオプションです。また、ローカルブローカーが長時間切断されている場合に、リモートブローカーでメッセージをビルドできないようにする場合にも便利なオプションです。ただし、接続されていない間にメッセージをローカルブローカーに対して常にキューに入れる必要がある場合、このオプションをfalse
に設定します。これにより、ローカルブローカーでメッセージが失われないようにします。 auto-delete-delay
- ローカルブローカーが切断されると、このプロパティーの値は、動的に作成されるリモートキューが自動的に削除されるまでの時間 (ミリ秒単位) を指定します。
auto-delete-message-count
- ローカルブローカーが切断されると、このプロパティーの値は、キューが自動的に削除される前に動的に作成されたリモートキューにあるメッセージの最大数を指定します。
enable-divert-bindings
-
このプロパティーを
true
に設定すると、迂回バインディングは必要に応じてリッスンできます。アドレスポリシーに含まれるアドレスに一致するアドレスを持つ迂回バインディングがある場合、迂回の転送アドレスに一致するキューバインディングは要求を作成します。デフォルト値はfalse
です。 max-hops
- フェデレーション中にメッセージが実行できるホップの最大数。特定のトポロジーでは、このプロパティーに特定の値が必要です。これらの要件の詳細は、「アドレスフェデレーションの一般的なトポロジー」 を参照してください。
transformer-ref
- トランスフォーマー設定の名前。フェデレーションされたメッセージ送信時にメッセージを変換する場合は、トランスフォーマー設定を追加できます。トランスフォーマー設定は、この手順の後半で説明します。
<address-policy>
要素内に、アドレスポリシーからアドレスを追加し、アドレスを除外するためのアドレス一致パターンを追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> </federation> </federations>
include
-
この要素の
address-match
プロパティーの値は、アドレスポリシーに含めるアドレスを指定します。queue.bbc.new
やqueue.usatoday
など、正確なアドレスを指定できます。または、ワイルドカード式を使用して一致するアドレスの セット を指定できます。前の例では、アドレスポリシーには、文字列queue.news
で始まるアドレス名が すべて 含まれます。 exclude
-
この要素の
address-match
プロパティーの値は、アドレスポリシーから除外するアドレスを指定します。正確なアドレス名を指定するか、ワイルドカード式を使用して一致するアドレスの セット を指定できます。上記の例では、アドレスポリシーは文字列queue.news.sport
で始まるすべてのアドレス名を除外します。
(オプション)
federation
要素内に、カスタムトランスフォーマー実装を参照するtransformer
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
name
-
トランスフォーマー設定の名前。この名前は、ローカルブローカーで一意である必要があります。これは、アドレスポリシーの
transformer-ref
プロパティーの値として指定する名前です。 class-name
org.apache.activemq.artemis.core.server.transformer.Transformer
インターフェイスを実装するユーザー定義クラスの名前。トランスフォーマーの
transform()
メソッドは、メッセージが送信される前にメッセージで呼び出されます。これにより、メッセージヘッダーまたはボディーをフェデレーションする前に変換できます。プロパティー
- 特定のトランスフォーマー設定のキーと値のペアを保持するために使用されます。
federation
要素内に、upstream
要素を 1 つ以上追加します。各upstream
要素は、リモートブローカーへの接続と、その接続に適用するポリシーを定義します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <upstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <policy ref="news-address-federation"/> </upstream> <upstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <policy ref="news-address-federation"/> </upstream> <address-policy name="news-address-federation" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" enable-divert-bindings="false" max-hops="1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
static-connectors
-
ローカルブローカーの
broker.xml
設定ファイルの他の場所で定義されるconnector
要素を参照するconnector-ref
要素のリストが含まれます。コネクターは、送信接続に使用するトランスポート (TCP、SSL、HTTP など) およびサーバー接続パラメーター (ホスト、ポートなど) を定義します。この手順の次のステップは、static-connectors
要素で参照されるコネクターを追加する方法を示しています。 policy-ref
- アップストリームブローカーに適用されるダウンストリームブローカーに設定されたアドレスポリシーの名前。
アップストリーム
要素に指定できる追加オプションを以下に示します。name
-
アップストリームブローカー設定の名前。この例では、名前は
eu-east-1
とeu-west-1
というアップストリームブローカーに対応します。 user
-
アップストリームブローカーへの接続の作成時に使用するユーザー名。指定のない場合は、
federation
要素の設定に指定された共有ユーザー名が使用されます。 password
-
アップストリームブローカーへの接続の作成時に使用するパスワード。指定のない場合は、
federation
要素の設定に指定された共有パスワードが使用されます。 call-failover-timeout
-
call-timeout
と同様ですが、フェイルオーバーの試行中に呼び出しが行われる場合に使用されます。デフォルト値は-1
で、タイムアウトが無効であることを意味します。 call-timeout
-
ブロック呼び出しであるパケットを送信すると、フェデレーション接続がリモートブローカーからの応答を待つ時間 (ミリ秒単位)。この時間が経過すると、接続によって例外が発生します。デフォルト値は
30000
です。 check-period
-
フェデレーション接続の健常性を確認するために、ローカルブローカがリモートブローカに送信する連続した“keep-alive"メッセージ間の期間 (ミリ秒)。フェデレーション接続が正常である場合、リモートブローカーは各キープアライブメッセージに応答します。接続が正常でないと、ダウンストリームブローカーがアップストリームブローカーから応答を受信できない場合に、サーキットブレーカー と呼ばれるメカニズムを使用してフェデレーションされたコンシューマーをブロックします。詳細は、
circuit-breaker-timeout
パラメーターの説明を参照してください。check-period
パラメーターのデフォルト値は30000
です。 circuit-breaker-timeout
- ダウンストリームとアップストリームブローカー間の単一の接続は、多くのフェデレーションされたキューとアドレスコンシューマーによって共有される可能性があります。ブローカー間の接続が失われた場合、フェデレーションされた各コンシューマーは同時に再接続を試みる可能性があります。これを回避するには、サーキットブレーカー と呼ばれるメカニズムはコンシューマーをブロックします。指定したタイムアウト値が経過すると、サーキットブレーカーは接続を再送します。成功すると、コンシューマーはブロックされません。それ以外の場合は、サーキットブレーカーが再度適用されます。
connection-ttl
-
リモートブローカーからのメッセージを受信しなくなった場合に、フェデレーション接続が存続する時間 (ミリ秒単位)。デフォルト値は
60000
です。 discovery-group-ref
-
アップストリームブローカーへの接続に静的コネクターを定義する代わりに、この要素を使用して
broker.xml
設定ファイルの別の場所で設定済みの検出グループを指定できます。具体的には、この要素のdiscovery-group-name
プロパティーの値として、既存の検出グループを指定します。検出グループの詳細は、「ブローカー検出メソッド」 を参照してください。 ha
-
アップストリームブローカーへの接続に対して、高可用性が有効であるかどうかを指定します。このパラメーターの値を
true
に設定すると、ローカルブローカーはアップストリームクラスターで利用可能なブローカーに接続でき、ライブアップストリームブローカーがシャットダウンすると、バックアップブローカーに自動フェイルオーバーされます。デフォルト値はfalse
です。 initial-connect-attempts
-
ダウンストリームブローカーがアップストリームブローカーに接続するようにする初期試行の数。接続を確立せずにこの値に達すると、アップストリームブローカーは永続的にオフラインとみなされます。ダウンストリームブローカーは、メッセージをアップストリームブローカーにルーティングしなくなりました。デフォルト値は
-1
で、制限がないことを意味します。 max-retry-interval
-
リモートブローカーへの接続に失敗した場合に後続の再接続試行の間隔 (ミリ秒単位)。デフォルト値は
2000
です。 reconnect-attempts
-
接続が失敗した場合に、ダウンストリームブローカーがアップストリームブローカーへの再接続を試行する回数。接続が再確立されていない状態でこの値に達すると、アップストリームブローカーは永続的にオフラインとみなされます。ダウンストリームブローカーは、メッセージをアップストリームブローカーにルーティングしなくなりました。デフォルト値は
-1
で、制限がないことを意味します。 retry-interval
-
リモートブローカーへの接続に失敗した場合に、後続の再接続試行の間隔 (ミリ秒単位)。デフォルト値は
500
です。 retry-interval-multiplier
-
retry-interval
パラメーターの値に適用される乗率。デフォルト値は1
です。 share-connection
-
同じブローカーにダウンストリーム接続とアップストリーム接続の両方が設定されている場合には、ダウンストリーム設定とアップストリーム設定の両方がこのパラメーターの値を
true
に設定している限り、同じ接続が共有されます。デフォルト値はfalse
です。
ローカルブローカーで、コネクターをリモートブローカーに追加します。これらは、フェデレーションされたアドレス設定の
static-connectors
要素で参照されるコネクターです。以下に例を示します。<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors>
4.22.4.2.3. ダウンストリームアドレスフェデレーションの設定
以下の例は、スタンドアロンブローカーにダウンストリームアドレスフェデレーションを設定する方法を示しています。
ダウンストリームアドレスのフェデレーションにより、1 つ以上のリモートブローカーがローカルブローカーに接続するために使用するローカルブローカーに設定を追加できます。このアプローチの利点は、すべてのフェデレーション設定を単一のブローカーに維持できることです。これは、たとえば hub-and-spoke トポロジーに役立ちます。
ダウンストリームアドレスのフェデレーションは、フェデレーション接続の方向対アップストリームアドレス設定の方向を逆にします。したがって、リモートブローカーを設定に追加する際に、ダウンストリーム ブローカーとみなされます。ダウンストリームブローカーは、設定の接続情報を使用して、ローカルブローカーに接続し、アップストリームとみなされるようになりました。この例は、この後、リモートブローカーの設定を追加する際に説明します。
前提条件
- アップストリームアドレスフェデレーションの設定を理解している。「アップストリームのアドレスフェデレーションの設定」 を参照してください。
- 以下の例は、スタンドアロンブローカー間でアドレスフェデレーションを設定する方法を示しています。ただし、ブローカー クラスター のフェデレーションを設定するための要件も理解している必要があります。詳細は、「ブローカークラスターのフェデレーションの設定」 を参照してください。
手順
-
ローカルブローカーで、
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 <federation>
要素が含まれる<federations >
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
アドレスポリシー設定を追加します。以下に例を示します。
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" max-hops="1" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> </federation> ... </federations>
送信前にメッセージを変換する場合は、トランスフォーマー設定を追加します。以下に例を示します。
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <address-policy name="news-address-federation" max-hops="1" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
各リモートブローカーに
ダウンストリーム
要素を追加します。以下に例を示します。<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <downstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <downstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <address-policy name="news-address-federation" max-hops="1" auto-delete="true" auto-delete-delay="300000" auto-delete-message-count="-1" transformer-ref="news-transformer"> <include address-match="queue.bbc.new" /> <include address-match="queue.usatoday" /> <include address-match="queue.news.#" /> <exclude address-match="queue.news.sport.#" /> </address-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
上記の設定で示されているように、リモートブローカーはローカルブローカーのダウンストリームであると見なされます。ダウンストリームブローカーは、設定の接続情報を使用して、ローカル (アップストリーム) ブローカーへ再度接続します。
ローカルブローカーで、ローカルブローカーおよびリモートブローカーによって使用されるコネクターとアクセプターを追加して、フェデレーション接続を確立します。以下に例を示します。
<connectors> <connector name="netty-connector">tcp://localhost:61616</connector> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors> <acceptors> <acceptor name="netty-acceptor">tcp://localhost:61616</acceptor> </acceptors>
connector name="netty-connector"
- ローカルブローカーがリモートブローカーに送信するコネクター設定。リモートブローカーはこの設定を使用してローカルブローカーに接続し直します。
connector name="eu-west-1-connector"
,connector name="eu-east-1-connector"
- リモートブローカーへのコネクター。ローカルブローカーはこれらのコネクターを使用してリモートブローカーに接続し、リモートブローカーがローカルブローカーに接続するために必要な設定を共有します。
acceptor name="netty-acceptor"
- ローカルブローカーに接続するためにリモートブローカーによって使用されるコネクターに対応するローカルブローカーのアクセプター。
4.22.4.2.4. キューフェデレーションについて
キューフェデレーションは、他のリモートブローカー全体でローカルブローカーの単一キューの負荷を分散する方法を提供します。
負荷分散を実現するため、ローカルブローカーはローカルコンシューマーからのメッセージの要求を満たすために、リモートキューからメッセージを取得します。以下に例を示します。
図4.9 対称キューフェデレーション
リモートキューを再設定する必要はありません。同じブローカーまたは同じクラスター内に配置する必要はありません。リモートリンクおよびフェデレーションされたキューの作成に必要なすべての設定はローカルブローカーにあります。
4.22.4.2.4.1. キューフェデレーションの利点
以下は、キューのフェデレーションの設定を選択する理由です。
- 容量の増加
- キューフェデレーションは、多くのブローカーに分散される "論理" キューを作成できます。この論理分散キューは、単一のブローカーにある 1 つのキューよりもはるかに高い容量を持ちます。この設定では、最初に公開されていたブローカーから消費できるメッセージがいくつでも消費されます。システムは、負荷分散が必要な場合にのみ、フェデレーション中のメッセージを移動します。
- マルチリージョン設定のデプロイ
マルチリージョン設定では、メッセージプロデューサーが 1 つのリージョンまたは venue にあり、コンシューマーが別のリージョンにある可能性があります。ただし、プロデューサーとコンシューマー接続を指定のリージョンに対してローカルに維持することが理想的です。この場合、プロデューサーとコンシューマーが存在する各リージョンにブローカーをデプロイし、キューフェデレーションを使用して、リージョン間での Wide Area Network(WAN) でメッセージを移動できます。以下に例を示します。
図4.10 マルチリージョンキューフェデレーション
- 安全なエンタープライズ LAN と DMZ 間の通信
ネットワークセキュリティーでは、demilitarized zone (DMZ) は物理または論理のサブネットワークで、企業の外部向けサービスを含み、信頼できない外部向けのサービス (通常はインターネットなど、信頼されていない、より大規模なネットワーク) に公開します。その他の企業のローカルエリアネットワーク (LAN) は、ファイアウォールの背後でこの外部ネットワークから分離されます。
セキュアなエンタープライズ LAN の多くのメッセージプロデューサーが DMZ と多数のコンシューマーにある場合、プロデューサーが安全なエンタープライズ LAN のブローカーに接続できないことがあります。この場合、プロデューサーがメッセージを公開できる DMZ にブローカーをデプロイできます。その後、エンタープライズ LAN のブローカーは DMZ のブローカーに接続し、フェデレーションされたキューを使用して DMZ のブローカーからメッセージを受信します。
4.22.4.2.5. アップストリームキューフェデレーションの設定
以下の例は、スタンドアロンブローカーにアップストリームのキューフェデレーションを設定する方法を示しています。この例では、ローカル (つまりダウンストリーム) ブローカーから一部のリモート (つまりアップストリーム) ブローカーへのフェデレーションを設定します。
前提条件
- 以下の例は、スタンドアロンブローカー間でキューフェデレーションを設定する方法を示しています。ただし、ブローカー クラスター のフェデレーションを設定するための要件も理解している必要があります。詳細は、「ブローカークラスターのフェデレーションの設定」 を参照してください。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 新しい
<federations>
要素に、<federation>
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
name
- フェデレーション設定の名前。この例では、名前はダウンストリームブローカーの名前に対応します。
user
- アップストリームブローカーに接続するための共有ユーザー名。
password
- アップストリームブローカーに接続するための共有パスワード。
注記- ユーザーとパスワードの認証情報がアップストリームブローカーごとに異なる場合は、設定に追加する時にこれらのブローカーの認証情報を個別に指定できます。これは、この手順の後半で説明します。
federation
要素内に<queue-policy>
要素を追加します。<queue-policy>
要素のプロパティー値を指定します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> </queue-policy> </federation> </federations>
name
- キューポリシーの名前。ブローカーに設定されるキューポリシーはすべて一意の名前である必要があります。
include-federated
このプロパティーの値を
false
に設定すると、設定は、すでにフェデレーションされたコンシューマー (つまりフェデレーションされたキューのコンシューマー) は統合しなおされません。これにより、対称または閉ループトポロジーで、フェデレーションされていないコンシューマーが存在せず、メッセージがシステム内を無限に流れる状況を回避できます。閉ループトポロジーが ない 場合は、このプロパティーの値を
true
に設定できます。たとえば、3 つのブローカー、BrokerA
、BrokerB
、およびBrokerC
のチェーンがあり、プロデューサーがBrokerA
のコンシューマーとBrokerC
のコンシューマーがあるとします。この場合、BrokerB
がコンシューマーをBrokerA
に再フェデレーションする 必要があります。priority-adjustment
コンシューマーがキューに接続すると、その優先度は、アップストリーム (フェデレーションされた) コンシューマーの作成時に優先順位が使用されます。フェデレーションされたコンシューマーの優先度は、
priority-adjustment
プロパティーの値で調整します。このプロパティーのデフォルト値は-1
です。これにより、負荷分散時にローカルコンシューマーがフェデレーションされたコンシューマーよりも優先されます。ただし、必要に応じて優先度の調整の値を変更できます。優先度の調整によって、フェデレーテッドコンシューマーに移動するメッセージが多すぎるためにブローカー間でメッセージが行き来するのを防げない場合は、フェデレーテッドコンシューマーに移動するメッセージのバッチサイズを制限できます。バッチサイズを制限するには、フェデレーテッドコンシューマーの接続 URI の
consumerWindowSize
値を0
に設定します。tcp://<host>:<port>?consumerWindowSize=0
consumerWindowSize
パラメーターが0
に設定されている場合、AMQ Broker は、一致するアドレスのアドレス設定のdefaultConsumerWindowSize
属性値を使用して、ブローカー間を移動できるメッセージのバッチサイズを決定します。defaultConsumerWindowSize
属性のデフォルト値は1048576
バイトです。transformer-ref
- トランスフォーマー設定の名前。フェデレーションされたメッセージ送信時にメッセージを変換する場合は、トランスフォーマー設定を追加できます。トランスフォーマー設定は、この手順の後半で説明します。
<queue-policy>
要素内に、キューポリシーからアドレスを追加し、除外する address-matching パターンを追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> </federation> </federations>
include
この要素の
address-match
プロパティーの値は、キューポリシーに含めるアドレスを指定します。queue.bbc.new
やqueue.usatoday
など、正確なアドレスを指定できます。または、ワイルドカード式を使用して一致するアドレスの セット を指定できます。上記の例では、アドレスポリシーには文字列queue.news
で始まるすべてのアドレス名も含まれています。address-match
プロパティーと組み合わせて、queue-match
プロパティーを使用して、キューポリシーにこれらのアドレスに特定のキューを含めることができます。address-match
プロパティーと同様に、正確なキュー名を指定することも、ワイルドカード式を使用して 一連 のキューを指定することもできます。上記の例では、番号記号 (#
) のワイルドカード文字は、各アドレスまたはアドレスセットにある すべて のキューがキューポリシーに含まれることを示しています。exclude
-
この要素の
address-match
プロパティーの値は、キューポリシーから除外するアドレスを指定します。正確なアドレスを指定するか、ワイルドカード式を使用して一致するアドレスの セット を指定できます。上記の例では、数字記号 (#
) ワイルドカード文字は、全 アドレスのqueue-match
プロパティーと一致するキューがすべて除外されることを意味します。この場合、.local
という文字列で終了するキューは除外されます。これは、特定のキューがローカルキューとして保持され、フェデレーションされていないことを示しています。
federation
要素内に、カスタムトランスフォーマー実装を参照するtransformer
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
name
-
トランスフォーマー設定の名前。この名前は、対象となるブローカーで一意でなければなりません。この名前は、アドレスポリシーの
transformer-ref
プロパティーの値として指定します。 class-name
org.apache.activemq.artemis.core.server.transformer.Transformer
インターフェイスを実装するユーザー定義クラスの名前。トランスフォーマーの
transform()
メソッドは、メッセージが送信される前にメッセージで呼び出されます。これにより、メッセージヘッダーまたはボディーをフェデレーションする前に変換できます。プロパティー
- 特定のトランスフォーマー設定のキーと値のペアを保持するために使用されます。
federation
要素内に、upstream
要素を 1 つ以上追加します。各upstream
要素は、アップストリームブローカー接続と、その接続に適用するポリシーを定義します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <upstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <policy ref="news-queue-federation"/> </upstream> <upstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <policy ref="news-queue-federation"/> </upstream> <queue-policy name="news-queue-federation" include-federated="true" priority-adjustment="-5" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> </federations>
static-connectors
-
ローカルブローカーの
broker.xml
設定ファイルの他の場所で定義されるconnector
要素を参照するconnector-ref
要素のリストが含まれます。コネクターは、送信接続に使用するトランスポート (TCP、SSL、HTTP など) およびサーバー接続パラメーター (ホスト、ポートなど) を定義します。以下の手順は、フェデレーションされたキュー設定のstatic-connectors
要素で参照されるコネクターを追加する方法を示しています。 policy-ref
- アップストリームブローカーに適用されるダウンストリームブローカーに設定されたキューポリシーの名前。
アップストリーム
要素に指定できる追加オプションを以下に示します。name
-
アップストリームブローカー設定の名前。この例では、名前は
eu-east-1
とeu-west-1
というアップストリームブローカーに対応します。 user
-
アップストリームブローカーへの接続の作成時に使用するユーザー名。指定のない場合は、
federation
要素の設定に指定された共有ユーザー名が使用されます。 password
-
アップストリームブローカーへの接続の作成時に使用するパスワード。指定のない場合は、
federation
要素の設定に指定された共有パスワードが使用されます。 call-failover-timeout
-
call-timeout
と同様ですが、フェイルオーバーの試行中に呼び出しが行われる場合に使用されます。デフォルト値は-1
で、タイムアウトが無効であることを意味します。 call-timeout
-
ブロック呼び出しであるパケットを送信すると、フェデレーション接続がリモートブローカーからの応答を待つ時間 (ミリ秒単位)。この時間が経過すると、接続によって例外が発生します。デフォルト値は
30000
です。 check-period
-
フェデレーション接続の健常性を確認するために、ローカルブローカがリモートブローカに送信する連続した“keep-alive"メッセージ間の期間 (ミリ秒)。フェデレーション接続が正常である場合、リモートブローカーは各キープアライブメッセージに応答します。接続が正常でないと、ダウンストリームブローカーがアップストリームブローカーから応答を受信できない場合に、サーキットブレーカー と呼ばれるメカニズムを使用してフェデレーションされたコンシューマーをブロックします。詳細は、
circuit-breaker-timeout
パラメーターの説明を参照してください。check-period
パラメーターのデフォルト値は30000
です。 circuit-breaker-timeout
- ダウンストリームとアップストリームブローカー間の単一の接続は、多くのフェデレーションされたキューとアドレスコンシューマーによって共有される可能性があります。ブローカー間の接続が失われた場合、フェデレーションされた各コンシューマーは同時に再接続を試みる可能性があります。これを回避するには、サーキットブレーカー と呼ばれるメカニズムはコンシューマーをブロックします。指定したタイムアウト値が経過すると、サーキットブレーカーは接続を再送します。成功すると、コンシューマーはブロックされません。それ以外の場合は、サーキットブレーカーが再度適用されます。
connection-ttl
-
リモートブローカーからのメッセージを受信しなくなった場合に、フェデレーション接続が存続する時間 (ミリ秒単位)。デフォルト値は
60000
です。 discovery-group-ref
-
アップストリームブローカーへの接続に静的コネクターを定義する代わりに、この要素を使用して
broker.xml
設定ファイルの別の場所で設定済みの検出グループを指定できます。具体的には、この要素のdiscovery-group-name
プロパティーの値として、既存の検出グループを指定します。検出グループの詳細は、「ブローカー検出メソッド」 を参照してください。 ha
-
アップストリームブローカーへの接続に対して、高可用性が有効であるかどうかを指定します。このパラメーターの値を
true
に設定すると、ローカルブローカーはアップストリームクラスターで利用可能なブローカーに接続でき、ライブアップストリームブローカーがシャットダウンすると、バックアップブローカーに自動フェイルオーバーされます。デフォルト値はfalse
です。 initial-connect-attempts
-
ダウンストリームブローカーがアップストリームブローカーに接続するようにする初期試行の数。接続を確立せずにこの値に達すると、アップストリームブローカーは永続的にオフラインとみなされます。ダウンストリームブローカーは、メッセージをアップストリームブローカーにルーティングしなくなりました。デフォルト値は
-1
で、制限がないことを意味します。 max-retry-interval
-
リモートブローカーへの接続に失敗した場合に後続の再接続試行の間隔 (ミリ秒単位)。デフォルト値は
2000
です。 reconnect-attempts
-
接続が失敗した場合に、ダウンストリームブローカーがアップストリームブローカーへの再接続を試行する回数。接続が再確立されていない状態でこの値に達すると、アップストリームブローカーは永続的にオフラインとみなされます。ダウンストリームブローカーは、メッセージをアップストリームブローカーにルーティングしなくなりました。デフォルト値は
-1
で、制限がないことを意味します。 retry-interval
-
リモートブローカーへの接続に失敗した場合に、後続の再接続試行の間隔 (ミリ秒単位)。デフォルト値は
500
です。 retry-interval-multiplier
-
retry-interval
パラメーターの値に適用される乗率。デフォルト値は1
です。 share-connection
-
同じブローカーにダウンストリーム接続とアップストリーム接続の両方が設定されている場合には、ダウンストリーム設定とアップストリーム設定の両方がこのパラメーターの値を
true
に設定している限り、同じ接続が共有されます。デフォルト値はfalse
です。
ローカルブローカーで、コネクターをリモートブローカーに追加します。これらは、フェデレーションされたアドレス設定の
static-connectors
要素で参照されるコネクターです。以下に例を示します。<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors>
注記サイズの大きいメッセージをフェデレーション接続経由で送受信する場合は、フェデレーション接続に使用されるコネクターで
consumerWindowSize
パラメーターを -1 に設定します。consumerWindowSize
パラメーターを -1 に設定すると、このパラメーターに制限が設定されず、接続間でサイズの大きいメッセージが送受信されるようになります。以下に例を示します。<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616?consumerWindowSize=-1</connector> <connector name="eu-east-1-connector">tcp://localhost:61617?consumerWindowSize=-1</connector> </connectors>
サイズの大きいメッセージの詳細は、8章大きなメッセージの処理 を参照してください。
4.22.4.2.6. ダウンストリームキューフェデレーションの設定
以下の例は、ダウンストリームキューフェデレーションを設定する方法を示しています。
ダウンストリームキューのフェデレーションにより、1 つ以上のリモートブローカーがローカルブローカーに接続するために使用するローカルブローカーに設定を追加できます。このアプローチの利点は、すべてのフェデレーション設定を単一のブローカーに維持できることです。これは、たとえば hub-and-spoke トポロジーに役立ちます。
ダウンストリームキューのフェデレーションは、フェデレーション接続の方向対アップストリームキュー設定の方向を逆にします。したがって、リモートブローカーを設定に追加する際に、ダウンストリーム ブローカーとみなされます。ダウンストリームブローカーは、設定の接続情報を使用して、ローカルブローカーに接続し、アップストリームとみなされるようになりました。この例は、この後、リモートブローカーの設定を追加する際に説明します。
前提条件
- アップストリームキューフェデレーションの設定を理解する必要があります。「アップストリームキューフェデレーションの設定」 を参照してください。
- 以下の例は、スタンドアロンブローカー間でキューフェデレーションを設定する方法を示しています。ただし、ブローカー クラスター のフェデレーションを設定するための要件も理解している必要があります。詳細は、「ブローカークラスターのフェデレーションの設定」 を参照してください。
手順
-
<broker_instance_dir>/etc/broker.xml
設定ファイルを開きます。 <federation>
要素が含まれる<federations >
要素を追加します。以下に例を示します。<federations> <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> </federation> </federations>
キューポリシー設定を追加します。以下に例を示します。
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" priority-adjustment="-5" include-federated="true" transformer-ref="new-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> </federation> ... </federations>
送信前にメッセージを変換する場合は、トランスフォーマー設定を追加します。以下に例を示します。
<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <queue-policy name="news-queue-federation" priority-adjustment="-5" include-federated="true" transformer-ref="news-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
各リモートブローカーに
ダウンストリーム
要素を追加します。以下に例を示します。<federations> ... <federation name="eu-north-1" user="federation_username" password="32a10275cf4ab4e9"> <downstream name="eu-east-1"> <static-connectors> <connector-ref>eu-east-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <downstream name="eu-west-1" > <static-connectors> <connector-ref>eu-west-connector1</connector-ref> </static-connectors> <upstream-connector-ref>netty-connector</upstream-connector-ref> <policy ref="news-address-federation"/> </downstream> <queue-policy name="news-queue-federation" priority-adjustment="-5" include-federated="true" transformer-ref="new-transformer"> <include queue-match="#" address-match="queue.bbc.new" /> <include queue-match="#" address-match="queue.usatoday" /> <include queue-match="#" address-match="queue.news.#" /> <exclude queue-match="#.local" address-match="#" /> </queue-policy> <transformer name="news-transformer"> <class-name>org.myorg.NewsTransformer</class-name> <property key="key1" value="value1"/> <property key="key2" value="value2"/> </transformer> </federation> ... </federations>
上記の設定で示されているように、リモートブローカーはローカルブローカーのダウンストリームであると見なされます。ダウンストリームブローカーは、設定の接続情報を使用して、ローカル (アップストリーム) ブローカーへ再度接続します。
ローカルブローカーで、ローカルブローカーおよびリモートブローカーによって使用されるコネクターとアクセプターを追加して、フェデレーション接続を確立します。以下に例を示します。
<connectors> <connector name="netty-connector">tcp://localhost:61616</connector> <connector name="eu-west-1-connector">tcp://localhost:61616</connector> <connector name="eu-east-1-connector">tcp://localhost:61617</connector> </connectors> <acceptors> <acceptor name="netty-acceptor">tcp://localhost:61616</acceptor> </acceptors>
connector name="netty-connector"
- ローカルブローカーがリモートブローカーに送信するコネクター設定。リモートブローカーはこの設定を使用してローカルブローカーに接続し直します。
connector name="eu-west-1-connector"
,connector name="eu-east-1-connector"
- リモートブローカーへのコネクター。ローカルブローカーはこれらのコネクターを使用してリモートブローカーに接続し、リモートブローカーがローカルブローカーに接続するために必要な設定を共有します。
acceptor name="netty-acceptor"
ローカルブローカーに接続するためにリモートブローカーによって使用されるコネクターに対応するローカルブローカーのアクセプター。
注記サイズの大きいメッセージをフェデレーション接続経由で送受信する場合は、フェデレーション接続に使用されるコネクターで
consumerWindowSize
パラメーターを -1 に設定します。consumerWindowSize
パラメーターを -1 に設定すると、このパラメーターに制限が設定されず、接続間でサイズの大きいメッセージが送受信されるようになります。以下に例を示します。<connectors> <connector name="eu-west-1-connector">tcp://localhost:61616?consumerWindowSize=-1</connector> <connector name="eu-east-1-connector">tcp://localhost:61617?consumerWindowSize=-1</connector> </connectors>
サイズの大きいメッセージの詳細は、8章大きなメッセージの処理 を参照してください。