7.7.3 メッセージの流量制御
ここでは,メッセージの流量制御について説明します。
CJMSプロバイダを使用したメッセージの送受信では,プロデューサーからコンシューマーに送信するメッセージのほか,CJMSプロバイダが使用する制御用のメッセージも送受信されます。これらのメッセージの送受信は,お互いに影響します。例えば,プロデューサーからコンシューマーに送信したメッセージに対するCJMSPブローカーでの確認応答の承認が遅れた場合などは,制御用のメッセージの送受信も遅れてしまうことになり,システム全体のパフォーマンスが低下してしまいます。
コネクション上のこれらのメッセージの流量を制御することで,メッセージ送受信の信頼性を高め,システムのパフォーマンスを向上させることができます。
CJMSプロバイダでは,メッセージの流量を制御するために,コンシューマーごとに送信するメッセージの流量を制限できます。
例えば,PTPメッセージングモデルでメッセージを送受信している場合,それぞれのコンシューマーの処理速度が低いときには,コンシューマー単位に配信するメッセージを制限します。これによって,複数のコンシューマーを使用してラウンドロビン方式で処理を実行し,システム全体の処理性能を向上させることができます。コンシューマー単位のメッセージの流量には,複数のコンシューマーに分散してメッセージを配信するためのオーバーヘッドの増加との関係を考慮して,適切な値を決定してください。
コンシューマー単位の制限値(consumerFlowLimit)については,送信先ごとにcjmsicmd create dstコマンドで設定します。コマンドの詳細については,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「cjmsicmd create dst(物理的送信先の作成)」を参照してください。なお,consumerFlowLimitの値は,コンシューマーで動作しているMessage-driven Bean単位の同時実行数(プールの最大インスタンス数)との関係も考慮して設定する必要があります。設定のパターンの例を次に示します。
- 「consumerFlowLimitの値<Message-driven Beanのプールの最大インスタンス数」と設定した場合
-
Message-driven Beanでは,consumerFlowLimitで指定した数のスレッドで処理が実行されます。
- 「consumerFlowLimitの値=Message-driven Beanのプールの最大インスタンス数」と設定した場合
-
プロデューサーから送信されたメッセージの数がconsumerFlowLimit以下の場合は,一つのコンシューマーですべての処理が実行されます。
プロデューサーから送信されたメッセージの数がconsumerFlowLimitを超える場合は,複数のコンシューマーで処理が実行されます。
consumerFlowLimitの設定による流量制御の概要を次の図に示します。
この例では,コンシューマー単位の制限値として,consumerFlowLimitを「10」と設定しています。プロデューサーから12個のメッセージが送信された場合,送信先からコンシューマー1には制限値である10個のメッセージが送信され,残りのメッセージはコンシューマー2に送信されます。各コンシューマーでは,Message-driven Beanの最大インスタンス数で設定した数以下のスレッドを使用して処理が実行されます。