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)
メソッドを使用して最大レートをクライアントに設定できます。