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

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

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

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

【问题讨论】:

    标签: java proxy apache-httpclient-4.x persistent apache-httpcomponents


    【解决方案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 倍。到目前为止,它对我来说效果很好。

    凯文

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多