17.2. プロデューサーフロー制御
また、HornetQ は、クライアントからサーバーに送信されるデータの量を制限してサーバーがデータでいっぱいにならないようにすることもできます。
17.2.1. ウィンドウベースフロー制御 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
コンシューマーウィンドウベースのフロー制御と同様に、HornetQ プロデューサー (デフォルト) は、メッセージのみをアドレスに送信できます (これを行うのに十分なクレジットがある場合)。メッセージを送信するのに必要なクレジットの量は、メッセージのサイズによって提供されます。
プロデューサーのクレジットが小さい場合、プロデューサーはサーバーからさらに多くのクレジットを要求します。サーバーがクレジット送信する場合、クレジットが大きければ大きいほどたくさんのメッセージを送信できます。
プロデューサーが一度に要求するクレジットの量は、ウィンドウサイズと呼ばれます。
したがって、ウィンドウサイズは、より多くを要求する前にある時点で保持できるバイトの量を決定します。これにより、リモート接続が過負荷の状態になることが回避されます。
17.2.1.1. コア API の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
HornetQ コア API が使用される場合、ウィンドウサイズは
ClientSessionFactory.setProducerWindowSize(int producerWindowSize) メソッドを使用して設定できます。
17.2.1.2. JMS の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
接続ファクトリーをルックアップするために JNDI が使用される場合、プロデューサーウィンドウサイズは
JBOSS_DIST/jboss-as/server/PROFILE/deploy/hornetq/hornetq-jms.xml で設定できます。
接続ファクトリーが直接インスタンス化される場合、プロデューサーウィンドウサイズは
HornetQConnectionFactory.setProducerWindowSize(int producerWindowSize) メソッドで設定できます。
17.2.1.3. ブロッキングプロデューサーウィンドウベースフロー制御 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
通常、サーバーは必ず要求されたのと同じクレジット数を提供します。ただし、アドレスに最大サイズを設定することもできます。これにより、メモリーを実行できないようにするために、アドレスに送信できる数のクレジットがブロックされます。
たとえば、"myqueue" という名前の JMS キューがある場合、最大メモリーサイズは 10 MB に設定でき、サーバーはメッセージを myqueue に送信しているすべてのプロデューサーに送信されたクレジットの数を制御します。つまり、キューのメッセージの合計は 10 MB を超えません。
アドレスがいっぱいになった場合、プロデューサーはアドレスでさらに多くのスペースが空くまで (つまり、メッセージがキューから消費され、より多くのメッセージを送信するためのスペースが空くまで) クライアントサイドでブロックします。これは、ブロッキングプロデューサーフロー制御と呼ばれます。
最大サイズのアドレスを設定し、このアドレスがいっぱいになった場合にこのアドレスに対するプロデューサーをブロックするようサーバーに指示するには、アドレスに対して AddressSettings (「アドレス設定を介してキューを設定」) ブロックを定義し、
max-size-bytes と address-full-policy を指定します。
アドレスブロックは、そのアドレスに登録されたすべてのキューに適用されます。つまり、そのアドレスにバインドされたすべてのキューのメモリーの合計は、
max-size-bytes を超えません。JMS トピックの場合、これは、トピックのすべてのサブスクリプションのメモリー合計が max-size-bytes を超えないことを意味します。
以下に例を示します。
上記の例では、JMS キュー "exampleQueue" の最大サイズが 100,000 バイトに設定され、その最大サイズを超えないようそのアドレスに送信するすべてのプロデューサーがブロックされます。
ブロッキングプロデューサーフロー制御を有効にするにはポリシーを
BLOCK に設定する必要があることに注意してください。