[我的理解,ClientConnectionManager的所有实现都基于路由持久连接。如果涉及代理,则基本上不会导致持久连接。例如,HttpClient需要通过具有固定IP的HTTP代理访问1000个不同的域,它必须与代理建立至少1000个连接,而不是与代理建立1个持久连接,并为1000个请求重复使用。
我正在模拟多个用户访问成千上万个域(虚假域,所有dns都解析为几个IP,解析发生在代理之后,因此与HttpClient无关)。当我增加用户和域的数量时,上述行为迅速用尽了localhost中所有可用的端口,结果发生了地址绑定错误。
有没有一种方法可以使HttpClient保持基于代理的连接?即。 HttpClient仅维护与给定代理的指定数量的连接。
经过深入研究,Apache HttpClient似乎不支持此行为。我必须修改HttpClient / HttpCore源才能具有此功能,即。维护仅基于localAddress和第一个代理地址的持久连接。
我修改的类是:
org.apache.http.conn.routing.HttpRounte.java和org.apache.http.conn.routing.BasicRouteDirector.java。
[基本上,我更改了HttpRoute中的hashCode和equal方法(用作持久conn查找的哈希表的键),因此如果涉及代理,则查找不考虑目标地址。
在我的方案中,上述修改的初始测试结果显示,请求吞吐量提高了约100倍。到目前为止,它对我来说还不错。
凯文