每个代理而不是每个路由的 Apache HttpClient 4 个持久连接

Posted

技术标签:

【中文标题】每个代理而不是每个路由的 Apache HttpClient 4 个持久连接【英文标题】:Apache HttpClient 4 persistent connection per Proxy instead of per route 【发布时间】:2012-11-16 22:24:11 【问题描述】:

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

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

有没有办法让 HttpClient 在代理的基础上保持连接? IE。一个 HttpClient 只维护与给定代理的指定数量的连接。

【问题讨论】:

【参考方案1】:

经过深入研究,Apache HttpClient 似乎不支持这种开箱即用的行为。我必须修改 HttpClient/HttpCore 源才能拥有此功能,即。仅基于 localAddress 和 First Proxy 地址维护持久连接。

我修改的类是:

org.apache.http.conn.routing.HttpRounte.java 和 org.apache.http.conn.routing.BasicRouteDirector.java.

基本上我更改了 HttpRoute 中的 hashCode 和 equal 方法(用作持久连接查找的 hashtable 的键),因此如果涉及代理,查找不会考虑目标地址。

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

凯文

【讨论】:

以上是关于每个代理而不是每个路由的 Apache HttpClient 4 个持久连接的主要内容,如果未能解决你的问题,请参考以下文章

EmberJS 从控制器加载视图而不是路由

为啥不应该总是使用 Apache 的事件 MPM 而不是工作 MPM?

在带有协议升级的 nginx 反向代理后面运行 daphne 总是路由到 http 而不是 websocket

使用 Apache ProxyPass 的反向代理重定向而不是透明地通过

为每个 URL 路由单独的 Laravel 控制器?

HTTP代理