Jetty's HttpClient
スレッドプールは、デフォルトでJetty's QueuedThreadPool
であり、スレッドをいくつか開始します。
これらのスレッドは、DNSルックアップ(Javaでブロックされ、非ブロック化される可能性がない)とレスポンスの受信に使用されます。 要求はアプリケーションスレッドとプールスレッドによって送信されます(要求がキューに入れられている場合は後者)。
JettyのHttpClient
は、JettyのNIOライブラリに基づいており、JDKのNIOライブラリに基づいているため、完全に非ブロックです。 このように、ではなく、は要求ごとにスレッドを必要とし、数多くの要求/応答を少数のスレッドで多重化することができます。
ネットワークI/Oを実行するときにHttpClient
が完全に非ブロッキングであっても、タイムアウトやDNSなどの追加スレッドが必要なことがあります。
小さなフットプリントと良好な並行性のバランスを取る必要がある場合は、HttpClient
に渡されたエグゼキュータをチューニングして、ベストな場所を見つけ出す必要があります。
調整するもう1つの重要な要因は、HttpClientTransportOverHTTP
レベルで設定されたセレクタの数です(http://www.eclipse.org/jetty/documentation/current/http-client-transport.html#_http_1_1_transportを参照)。
多くの要因によってスレッド数が異なるため、適切なスレッド数には何も共通の答えはありません。私が言ったように、あなたはそれを試して、さまざまなパラメータを調整する必要があります。例えば
、送信先アドレスは、すべてのよく知られている場合(たとえば、内部ネットワーク)、あなたがデフォルトの非同期SocketAddressResolver
を置き換えることができます。
httpClient.setSocketAddressResolver(new SocketAddressResolver.Sync());
、これは実行し、余分な派遣を取り除くますDNSルックアップ。
セレクタの数は、ハードウェアによっては、通常1〜5千を下回る数のソケットに対して1に保つことができます。
HttpClient
に使用できるスレッド数が少ないほど、負荷が増加するレイテンシは長くなります。 QueuedThreadPool
は、必要に応じて新しいスレッドを生成し、不要になったときに新しいスレッドを生成し、弾力的に動作します(したがって通常はデフォルト設定になります)。ただし、状況に応じてさまざまな設定を試すことができます。