3

我的理解是,ClientConnectionManager 的所有实现都基于路由保持连接。如果涉及代理,这将导致基本上没有持久连接。例如,HttpClient 需要通过具有固定 IP 的 HTTP 代理访问 1000 个不同的域,它必须与代理建立至少 1000 个连接,而不是创建到代理的 1 个持久连接并将其重用于 1000 个请求。

我正在模拟多个用户访问数千个域(假域,所有 dns 解析为几个 IP,解析发生在代理之后,因此与 HttpClient 无关)。当我增加用户和域的数量时,上述行为很快耗尽了 localhost 中的所有可用端口,结果发生地址绑定错误。

有没有办法让 HttpClient 在代理的基础上保持连接?IE。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 方法(用作持久连接查找的哈希表的键),因此如果涉及代理,查找不会考虑目标地址。

上述修改的初步测试结果显示,在我的场景中,请求吞吐量提高了大约 100 倍。到目前为止,它对我来说很好。

凯文

于 2012-11-21T20:30:51.827 回答