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

问题描述 投票:3回答:1

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

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

有没有一种方法可以使HttpClient保持基于代理的连接?即。 HttpClient仅维护与给定代理的指定数量的连接。

java proxy apache-httpclient-4.x persistent apache-httpcomponents
1个回答
2
投票

经过深入研究,Apache HttpClient似乎不支持此行为。我必须修改HttpClient / HttpCore源才能具有此功能,即。维护仅基于localAddress和第一个代理地址的持久连接。

我修改的类是:

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

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

在我的方案中,上述修改的初始测试结果显示,请求吞吐量提高了约100倍。到目前为止,它对我来说还不错。

凯文

© www.soinside.com 2019 - 2024. All rights reserved.