2017-06-23 36 views
1

Jetty HttpClientは起動時にスレッドを起動し、かなりの数のスレッドを生成するようです。 nioベースのネットワーキングの利点の1つがスレッド上で会話を多重化していると思ったので、私はこれに少し驚きました。 HttpClient.setExecutor(...)を使用してスレッド数を制御するのは簡単でしょうが、必要とされるスレッドの数を考える方法はわかりません。 HttpURLConnectionのように、ライブラリーには同時HTTP要求ごとに1つのスレッドが必要ですか?それはある程度多重化していますか?Jetty HttpClientはスレッドをどのように使用しますか?

私は、アプリケーション内で長寿命のAPIクライアントを定義しています。小さなフットプリントを維持し、良好な同時パフォーマンスを実現するためのバランスをとっています。

洞察力に感謝します。

答えて

4

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は、必要に応じて新しいスレッドを生成し、不要になったときに新しいスレッドを生成し、弾力的に動作します(したがって通常はデフォルト設定になります)。ただし、状況に応じてさまざまな設定を試すことができます。

関連する問題