26.3. クラスタリングされたグループ化

クラスターでのメッセージグループの使用は、特定のグループ ID を持つメッセージが任意のノードに到着するため、少し複雑になります。各ノードは、どのグループ ID がどのノードでどのコンシューマーにバインドされるかを知る必要があります。
特定のグループ ID に対するメッセージを処理するコンシューマーは、クラスターの異なるノードに存在することがあるため、各ノードはこの情報を知る必要があります (したがって、そのコンシューマーを持つノードに適切にメッセージをルーティングできます)。
これを解決するために、グループ化ハンドラーがあります。各ノードは独自のグループ化ハンドラーを持ち、メッセージが割り当てられたグループ ID とともに送信された場合に、ハンドラーはメッセージが選択すべきルートを決定します。
ハンドラーにはローカルとリモートの 2 つの種類があります。各クラスターはローカルグループ化ハンドラーを持つ 1 つのノードを選択し、他のすべてのノードはリモートハンドラーを持つ必要があります。ローカルハンドラーは、使用するルートに関する決定を行います。リモートハンドラーはこれと対話します。ここでは、両方の種類のハンドラーのサンプル設定を示します。これは、JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-configuration.xml ファイルで設定する必要があります。
<grouping-handler name="my-grouping-handler">
   <type>LOCAL</type>
   <address>jms</address>
   <timeout>5000</timeout>
</grouping-handler>
<grouping-handler name="my-grouping-handler">
   <type>REMOTE</type>
   <address>jms</address>
   <timeout>5000</timeout>
</grouping-handler>
address 属性は、クラスター接続と、使用するアドレス指定の種類 (jms またはコア) を参照します。timeout 属性は、決定を行うまでの待機時間 (ミリ秒単位) を参照します。タイムアウトに到達すると、送信中に例外がスローされます。これにより、厳密な順序付けが保持されます。

注記

クラスターの設定については、36章クラスター を参照してください。
メッセージをルーティングする場所に関する決定は、最初に、メッセージを受信するノードにより提示されます。ノードはクラスタリングされた通常のルーティング状況に応じて適切なルートを選択します (つまり、利用可能なキューを配布し、ローカルキューを最初に使用し、コンシューマーを持つキューを選択します)。提示がグループ化ハンドラーにより受け取られた場合は、ノードがその時点からこのキューにメッセージをルーティングします。拒否された場合は、代替のルートが提供され、ノードがこのキューに無限にルーティングされます。他のすべてのノードは、提示時に選択されたキューにルーティングされます。メッセージがキューに到着すると、通常の単一サーバーメッセージグループセマンティクスが引き継がれ、メッセージがそのキューのコンシューマーに割り当てられます。
単一のローカルハンドラーがある単一障害点が存在することに気づいたかもしれません。このノードがクラッシュした場合は、決定を行うことができなくなります。送信されたメッセージは、配信されず、例外がスローされます。これを回避するには、ローカルハンドラーは別のバックアップノードでレプリケートします。また、バックアップノードを作成し、同じローカルハンドラーで設定します。

26.3.1. クラスタリングされたグループ化のベストプラクティス

クラスタリングされたグループ化を使用する場合は、いくつかのベストプラクティスに従う必要があります。
  1. 可能な場合は、コンシューマーがさまざまなノードで均等に分散されるようにします。これは、コンシューマーを定期的に作成し、閉じる場合にのみ問題になります。メッセージは割り当てられた同じキュー常にルーティングされるため、このキューからコンシューマーを削除すると、コンシューマーがなくなり、キューがメッセージを受信し続けることになります。コンシューマーを閉じないようにするか、常にたくさんのコンシューマーがあるようにします。つまり、3 つのノードがある場合は、3 つのコンシューマーを用意します。
  2. 可能な場合は、耐性キューを使用します。グループがキューにバインドされたときにキューが削除された場合は、他のノードがメッセージをキューにルーティングすることを試行できます。これは、メッセージを送信するセッションでキューが削除されるようにすることにより回避できます。つまり、テキストメッセージが送信された場合、メッセージはキューが削除されたノードに送信され、新しい提示が適切に行わなわれるようになります。または、異なるグループ ID を使用して開始することもできます。
  3. 常に、ローカルグループ化ハンドラーを持つノードがレプリケートされるようにしてください。つまり、グループ化はフェイルオーバーで引き続き実行できます。