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 を使用している場合、クライアントは ConnectionFactorysetProducerWindowSize(int producerWindowSize) メソッドを呼び出してウィンドウサイズを直接設定できます。

コア API を使用している場合、ServerLocatorsetProducerWindowSize(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-settingmax-size-bytes を設定する
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=max-size-bytes,value=100000)
{"outcome" => "success"}
  • 指定された address-settingaddress-full-policy を設定する
/subsystem=messaging-activemq/server=default/address-setting=myqueue:write-attribute(name=address-full-policy,value=BLOCK)
{"outcome" => "success"}

レート制限フロー制御

JBoss EAP メッセージングでは、以下の例のように、プロデューサーが使用する connection-factoryproducer-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) メソッドを使用して最大レートをクライアントに設定できます。