第8章 フロー制御
フロー制御は、プロデューサーとコンシューマーの間のデータの流れを制限することで、プロデューサーとコンシューマーの負荷が大きくなるのを防ぎます。AMQ Core Protocol JMS を使用すると、コンシューマーとプロデューサー両方のフロー制御を設定できます。
コンシューマーフローの制御
コンシューマーフローの制御は、クライアントがブローカーからのメッセージを消費する際に、ブローカーとクライアントの間のデータフローを制御します。AMQ Core Protocol JMSは、デフォルトでメッセージをバッファーしてからコンシューマーに配信します。バッファーがない場合は、クライアントはメッセージを消費する前に、最初にブローカーから各メッセージを要求する必要があります。このタイプの「ラウンドトリップ」の通信はコストがかかります。メモリー不足の問題によりコンシューマーがメッセージをすぐに処理できず、バッファーが受信メッセージでオーバーフローすることがあるため、クライアント側のデータのフローを制限することが重要になります。
プロデューサーフロー制御
コンシューマーウィンドウベースのフロー制御と同様に、クライアントはプロデューサーからブローカーに送信されるデータ量をブローカーに制限し、ブローカーが大量のデータで過負荷にならないようにすることができます。プロデューサーの場合、ウィンドウサイズは 1 度にインフライトにできるバイト数を決定します。
8.1. コンシューマーウィンドウサイズの設定
クライアント側のバッファーに保持されるメッセージの最大サイズは、その ウィンドウサイズ によって決定されます。AMQ Core Protocol JMS のウインドウのデフォルトサイズは 1 MiB または 1024 * 1024 バイトです。ほとんどのユースケースでは、デフォルトのままで問題ありません。その他のケースでは、ウィンドウサイズの最適な値を見つけるために、システムのベンチマークが必要な場合があります。AMQ Core Protocol JMS を使用すると、デフォルトを変更する必要がある場合にバッファーウインドウサイズを設定できます。
以下の例は、AMQ Core Protocol JMS を使用する場合にコンシューマーウインドウサイズパラメーターを設定する方法を示しています。それぞれの例で、コンシューマーウィンドウサイズを 300,000 バイトに設定します。
手順
クライアントが JNDI を使用して接続ファクトリーをインスタンス化する場合は、接続文字列 URL の一部として
consumerWindowSize
パラメーターを含めます。JNDI コンテキスト環境内に URL を格納します。以下の例では、jndi.properties
ファイルを使用して URL を格納します。java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
java.naming.factory.initial=org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory connectionFactory.myConnectionFactory=tcp://localhost:61616?consumerWindowSize=300000
Copy to Clipboard Copied! クライアントが JNDI を使用して接続ファクトリーをインスタンス化しない場合は、値を
ActiveMQConnectionFactory.setConsumerWindowSize()
に渡します。ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(300000);
ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(...) cf.setConsumerWindowSize(300000);
Copy to Clipboard Copied!