19.2. プロデューサーフロー制御
JBoss EAP メッセージングは、サーバーの処理能力を超えるメッセージを受信しないように、クライアントから送信されるデータの量を制限することもできます。
ウィンドウベースのフロー制御
JBoss EAP メッセージングは、クレジットの交換を使用して、メッセージプロデューサーを制御します。プロデューサーは、これを行うのに十分なクレジットがある限り、メッセージをアドレスに送信することができます。メッセージを送信するのに必要なクレジットの量は、メッセージのサイズで決定されます。プロデューサーのクレジットが欠乏している場合、プロデューサーはサーバーからさらに多くのクレジットを要求します。サーバーの設定の中では、プロデューサーが一度に要求できるクレジットの量は producer-window-size と呼ばれ、次の connection-factory 要素の属性です。
<connection-factory name="MyConnFactory" ... producer-window-size="1048576" />
ウィンドウサイズで一度に送信できるバイト量が決定されるため、リモート接続によってサーバーに過重な負荷がかかるのを防ぎます。
管理 CLI を使用して、特定の接続ファクトリーの producer-window-size 属性を読み書きします。以下の例では RemoteConnectionFactory を使用しています。これはデフォルト設定に含まれており、リモートクライアントでの使用を目的としています。
-
管理 CLI を使用して
producer-window-size属性を読み取る:
subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:read-attribute(name=producer-window-size)
{
"outcome" => "success",
"result" => 65536
}
-
管理 CLI を使用して
producer-window-size属性を書き込む:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=producer-window-size,value=65536)
{"outcome" => "success"}
JMS を使用している場合、クライアントは ConnectionFactory の setProducerWindowSize(int producerWindowSize) メソッドを呼び出してウィンドウサイズを直接設定できます。
コア API を使用している場合、ServerLocator の setProducerWindowSize(int producerWindowSize) メソッドを使用してウィンドウサイズを設定できます。
プロデューサーウインドウベースのフロー制御のブロック
通常、メッセージングサーバーはリクエストされたのと同じ数のクレジットを提供します。ただし、サーバーから送信されるクレジットの数を制限することは可能で、これによりプロデューサーが一度に処理できる数を超えるメッセージを送信してメモリー不足に陥るのを防止できます。
たとえば、myqueue という JMS キューがあり、最大メモリーサイズを 10MB に設定すると、サーバーによってキュー内のメッセージ数が制限され、サイズが 10MB を超えることはなくなります。アドレスが満杯になると、十分な領域がアドレス上で解放されるまで、プロデューサーがクライアント側でブロックされます。
プロデューサーフロー制御のブロックは、ページング (プロデューサーをブロックするのではなく、メッセージをストレージにページングする) の代替アプローチです。詳細は ページングについて を参照してください。
address-setting 設定要素には、プロデューサーフロー制御のブロックを管理する設定が含まれます。address-setting は、そのアドレスに登録されているすべてのキューに一連の設定を適用するために使用されます。実施方法の詳細は、アドレス設定の設定 を参照してください。
プロデューサーフロー制御をブロックするのに必要な address-setting にはそれぞれ max-size-bytes 属性の値を含める必要があります。そのアドレスにバインドされるすべてのキューの合計メモリーが max-size-bytes を超えることはできません。JMS トピックの場合、トピックのすべてのサブスクリプションの合計メモリーが max-size-bytes を超えることができないことを意味します。
また、address-full-policy 属性を BLOCK に設定することも必要です。これによってプロデューサーは max-size-bytes に達するとブロックする必要があることを認識します。以下の例は、両方の属性セットを持つ address-setting です。
<address-setting ...
name="myqueue"
address-full-policy="BLOCK"
max-size-bytes="100000" />
上記の例では、JMS キューの myqueue の最大サイズを 100000 バイトに設定します。プロデューサーは、最大サイズに達した時点で、そのアドレスへの送信がブロックされます。
以下の例のように、管理 CLI を使用してこれらの属性を設定します。
-
指定された
address-settingのmax-size-bytesを設定する
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=max-size-bytes,value=100000)
{"outcome" => "success"}
-
指定された
address-settingのaddress-full-policyを設定する
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=address-full-policy,value=BLOCK)
{"outcome" => "success"}
レート制限フロー制御
JBoss EAP メッセージングでは、以下の例のように、プロデューサーが使用する connection-factory の producer-max-rate を指定すると、プロデューサーが 1 秒あたりに送信できるメッセージの数を制限します。
<connection-factory name="MyConnFactory" producer-max-rate="1000" />
デフォルト値は -1 で、レート制限フロー制御を無効にします。
管理 CLI を使用して producer-max-rate の値を読み書きします。以下の例では RemoteConnectionFactory を使用しています。これはデフォルト設定に含まれており、リモートクライアントでの使用を目的としています。
-
producer-max-rate属性の値を読み取る:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:read-attribute(name=producer-max-rate)
{
"outcome" => "success",
"result" => -1
}
-
producer-max-rate属性の値を書き込む:
/subsystem=messaging-activemq/server=default/connection-factory=RemoteConnectionFactory:write-attribute(name=producer-max-rate,value=100)
{"outcome" => "success"}
コア API を使用する場合は、ServerLocator.setProducerMaxRate(int producerMaxRate) メソッドを使用してレートを設定します。
JNDI を使用して接続ファクトリーのインスタンス化と検索を行う場合、インスタンス化された接続ファクトリーの setProducerMaxRate(int producerMaxRate) メソッドを使用して最大レートをクライアントに設定できます。