36.6. メッセージ再分散
クラスタリングの別の重要な部分はメッセージ再分散です。以前に、サーバーサイドのメッセージロードバランシングがどのようにラウンドロビンで処理されるか、またはメッセージをどのようにクラスター全体のすべてのノードに送信するかが示されました。
forward-when-no-consumers が false の場合、メッセージは一致するコンシューマーを持たないノードに転送されません。これによって、メッセージを消費するコンシューマーを持たないキューにメッセージが到着しないようになりますが、解決されない状況が発生します。メッセージがノードに送信された後にキューのコンシューマーがクローズした場合は何が起こりますか? キューにコンシューマーがない場合は、メッセージが消費されず、枯渇の状況が発生します。
メッセージ再分散はこの問題を解決し、HornetQ を設定して、一致するコンシューマーを持つクラスター内の他のノードに戻すコンシューマーがないキューからメッセージを自動的に再分散できます。
メッセージ再分散がキューの最後のコンシューマーがクローズされた直後に実行されるよう設定したり、メッセージ再分散が、キューの最後のコンシューマーが再分散の前にクローズされた後に設定可能な遅延を待つよう設定したりできます。デフォルトでは、メッセージ再分散が 60000 ミリ秒 (1 分) の遅延で有効になります。
メッセージ再分散は、アドレス設定で再分散遅延を指定することにより、アドレスごとに設定できます。アドレス設定の詳細については、23章キュー属性 を参照してください。
キューのセットに対してメッセージ再分散がどのように有効になるかを示す
JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-configuration.xml のアドレス設定のコード例を以下に示します。
<address-settings>
<address-setting match="jms.#">
<redistribution-delay>0</redistribution-delay>
</address-setting>
</address-settings>
<address-settings>
<address-setting match="jms.#">
<redistribution-delay>0</redistribution-delay>
</address-setting>
</address-settings>
上記の
address-settings ブロックは、"jms" で始まるアドレスにバインドされるキューに対して 0 の redistribution-delay を設定します。すべての JMS キュートトピックサブスクリプションは "jms" で始まるアドレスにバインドされるため、上記のコード例により、すべての JMS キューとトピックサブスクリプションがすぐに再分散されます (遅延なし)。
属性
match は完全一致、または HornetQ ワイルドカード構文に準拠する文字列になります (11章HornetQ ワイルドカード構文について で説明)。
要素
redistribution-delay は、メッセージがキューから、一致するコンシューマーを持たないクラスターの他のノードに再分散する前に、最後のコンシューマーがキューでクローズされるまでの遅延 (ミリ秒単位) を定義します。ゼロの遅延は、メッセージがすぐに再分散されることを意味します。値が -1 の場合は、メッセージが再分散されません。
再分散の前に遅延を発生させることが適切なことがよくあります。これは、コンシューマーがクローズしても、別のコンシューマーが同じキューにすぐに作成されるからです。この場合は、新しいコンシューマーが到着した直後に再分散したくないことが考えられます。