3

私の理解では、ClientConnectionManager のすべての実装は、ルートに基づいて接続を保持します。これにより、プロキシが関与している場合、基本的に永続的な接続がなくなります。たとえば、HttpClient は、修正 IP を持つ HTTP プロキシを介して 1000 の異なるドメインにアクセスする必要があります。プロキシへの 1 つの永続的な接続を作成して 1000 のリクエストに再利用するのではなく、少なくとも 1000 のプロキシへの接続を確立する必要があります。

何千ものドメインにアクセスする複数のユーザーをシミュレートしています (偽のドメイン、すべての dns がいくつかの IP に解決され、解決はプロキシの後に行われるため、HttpClient とは関係ありません)。上記の動作により、ユーザーとドメインの数を増やすと、ローカルホストで使用可能なすべてのポートがすぐに使い果たされ、その結果、アドレス バインド エラーが発生します。

HttpClient がプロキシ ベースで接続を維持するようにする方法はありますか? すなわち。HttpClient は、特定のプロキシへの指定された数の接続のみを維持します。

4

1 に答える 1

2

集中的な調査の結果、Apache HttpClient は、そのままではこの動作をサポートしていないようです。この機能を使用するには、HttpClient/HttpCore ソースを変更する必要があります。localAddress と First Proxy アドレスのみに基づいて永続的な接続を維持します。

私が変更したクラスは次のとおりです。

org.apache.http.conn.routing.HttpRounte.java および org.apache.http.conn.routing.BasicRouteDirector.java。

基本的に、HttpRoute の hashCode と equal メソッド (永続的な conn ルックアップのハッシュテーブルへのキーとして使用される) を変更したため、プロキシが関与している場合、ルックアップはターゲット アドレスを考慮しません。

上記の変更の最初のテスト結果は、私のシナリオでの要求スループットに関して約 100 倍の改善を示しています。これまでのところ、私にとってはうまく機能しています。

ケビン

于 2012-11-21T20:30:51.827 に答える