第19章 フロー制御
フロー制御は、クライアントとサーバー間のメッセージングデータのフローを制限するために使用されます。これはクライアントまたはサーバーがデータで一杯にならないようによう行われます。コンシューマー側とプロデューサー側の両方からデータのフローを管理できます。
19.1. コンシューマーフロー制御 リンクのコピーリンクがクリップボードにコピーされました!
JBoss EAP メッセージングには、コンシューマーのために事前にフェッチするデータ量を定義する設定とコンシューマーがメッセージを消費できる速度を制御する設定が含まれています。
ウィンドウベースのフロー制御
JBoss EAP メッセージングでは、メッセージを各コンシューマーのバッファーに事前フェッチします。バッファーサイズは connection-factory の consumer-window-size 属性で決定されます。次の設定例は、consumer-window-size 属性を明示的に設定した connection-factory を示しています。
<connection-factory name="MyConnFactory" ... consumer-window-size="1048576" />
<connection-factory name="MyConnFactory" ... consumer-window-size="1048576" />
管理 CLI を使用して、特定の connection-factory の consumer-window-size 属性の値を読み書きします。以下の例は、InVmConnectionFactory 接続ファクトリーを使用して実行する方法を示しています。これはサーバーと同じ仮想マシンに存在するコンシューマー (たとえば、ローカルの MessageDrivenBean) のデフォルトです。
-
管理 CLI から
InVmConnectionFactoryのconsumer-window-size属性を読み取る
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-window-size)
{
"outcome" => "success",
"result" => 1048576
}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-window-size)
{
"outcome" => "success",
"result" => 1048576
}
-
管理 CLI から
consumer-window-size属性を書き込む
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-window-size,value=1048576)
{"outcome" => "success"}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-window-size,value=1048576)
{"outcome" => "success"}
consumer-window-size の値は整数である必要があります。以下の表に記載されているように、特別な意味を持つ値もあります。
| Value | 説明 |
|---|---|
| n |
バッファーサイズを |
| 0 | バッファーをオフにします。これはコンシューマーが遅い場合に役に立つもので、複数のコンシューマーに確定的に分散することができます。 |
| -1 | 無制限バッファーを作成します。これにより、メッセージを受信するとすぐにプルして処理する非常に高速のコンシューマーを促進することができます。 |
consumer-window-size を -1 に設定すると、コンシューマーがメッセージを受信時にすぐに処理できない場合に、クライアントのメモリーをオーバーフローさせることができます。
コア API を使用している場合、setConsumerWindowSize() メソッドを使用して ServerLocator からコンシューマーウインドウサイズを設定できます。
JMS を使用している場合、クライアントはインスタンス化された ConnectionFactory の setConsumerWindowSize() メソッドを使用してコンシューマーウインドウのサイズを指定できます。
レート制限フロー制御
JBoss EAP メッセージングは、メッセージを消費するレートを 1 秒単位で制限できます。これはスロットルと呼ばれるフロー制御メソッドです。適切な connection-factory の consumer-max-rate 属性を使用して、指定した速度よりも早くコンシューマーがメッセージを消費しないようにします。
<connection-factory name="MyConnFactory" ... consumer-max-rate="10" />
<connection-factory name="MyConnFactory" ... consumer-max-rate="10" />
デフォルト値は -1 で、レート制限フロー制御を無効にします。
consumer-max-rate 属性の読み取りおよび書き込みには、管理 CLI を使用することが推奨されます。以下の例は、InVmConnectionFactory 接続ファクトリーを使用して実行する方法を示しています。これはサーバーと同じ仮想マシンに存在するコンシューマー (たとえば、ローカルの MessageDrivenBean) のデフォルトです。
-
管理 CLI を使用して
consumer-max-rate属性を読み取る:
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-max-rate)
{
"outcome" => "success",
"result" => -1
}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:read-attribute(name=consumer-max-rate)
{
"outcome" => "success",
"result" => -1
}
-
管理 CLI を使用して
consumer-max-rate属性を書き込む:
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-max-rate,value=100)
{"outcome" => "success"}
/subsystem=messaging-activemq/server=default/connection-factory=InVmConnectionFactory:write-attribute(name=consumer-max-rate,value=100)
{"outcome" => "success"}
JMS を使用している場合、インスタンス化された ConnectionFactory の setConsumerMaxRate(int consumerMaxRate) メソッドを使用して最大レートサイズを設定できます。
コア API を使用している場合、速度は ServerLocator.setConsumerMaxRate(int consumerMaxRate) メソッドで設定できます。