[英]Java Apache HTTPClient TIME_WAIT performance issues with PoolingHttpClientConnectionManager
我们将Apache HTTPClient与PoolingHttpClientConnectionManager一起使用,并为每个路由创建大小分别为200和200的连接池(调用相同的端点)。
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registryBuilder.build());
cm.setMaxTotal(200);
cm.setDefaultMaxPerRoute(200);
httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();
HTTPClient封装在一个单例类中(因此HTTPClient被共享)。 然后,我将使用它发出GET请求并使用状态码和正文进行响应。
public ResponseEntity<String> get(String url, Map<String, String> headers) throws IOException {
HttpGet httpget = new HttpGet(url);
httpget.setConfig(requestConfig);
headers.forEach(httpget::addHeader);
ResponseHandler<ResponseEntity<String>> responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String body = entity != null ? EntityUtils.toString(entity) : null;
return new ResponseEntity<>(body, HttpStatus.valueOf(status));
};
return httpClient.execute(httpget, responseHandler);
}
但是,由于机器处于CPU高负载下,因此我们在netstat
中命中了大约30,000个TIME_WAIT
套接字,并且只能达到大约250 TPS(我们的目标是1000 TPS)。
从30,000 TIME_WAIT
的声音看来,连接是否没有被重用?
有什么想法吗?
这是http保持活动功能,可以使其起作用。 通常,您的当前代码应该可以,因为默认情况下Apache HTTP-components中启用了keep-alive 。
因此,您需要确保:
这是一段对我有用的代码,与您的代码几乎相同:
DefaultHttpClient httpclient = new DefaultHttpClient();
PoolingClientConnectionManager pool = new PoolingClientConnectionManager(httpclient.getConnectionManager().getSchemeRegistry());
pool.setMaxTotal(5000);
pool.setDefaultMaxPerRoute(1000);
HttpParams params = httpclient.getParams();
httpclient = new DefaultHttpClient(pool, params);
如果不起作用,则可能是您连接的服务器不支持保持活动状态(在这种情况下它将永远无法工作)或不支持非标准保持活动状态,在这种最新情况下,您可以自定义保持活动状态Apache http-components的初学者: https ://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html-请参阅第2.6章-连接保持活动策略
可以在这里找到更多信息: http : //www.baeldung.com/httpclient-connection-management
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.