gpt4 book ai didi

java httpclient连接池租约与保持 Activity

转载 作者:行者123 更新时间:2023-12-01 20:57:27 27 4
gpt4 key购买 nike

我已经在生产中使用 apache httpclient 4.5 一段时间了,但最近,随着新用例的添加,系统开始出现故障。

我们有多个通过 REST Web 服务进行通信的服务,客户端是 apache httpclient 4.5 的包装器。

假设我有服务 A 与服务 B 进行通信。在我重新启动服务 B 之前,通信工作正常。由于超时,我从服务 A 向服务 B 发起的下一次调用失败。经过一些研究后,我发现出于性能原因(不再有 2 次握手等),底层 TCP 连接被重用。由于服务器已重新启动,底层 TCP 连接已失效。

阅读文档后,我发现我的连接可以在n秒后过期。假设我重新启动服务 B,那么调用将在前 n 秒内失败,但之后连接会重建。这是我实现的keepAliveStrategy

    connManager = new PoolingHttpClientConnectionManager();
connManager.setMaxTotal(100);
connManager.setDefaultMaxPerRoute(10);
ConnectionKeepAliveStrategy keepAliveStrategy = new DefaultConnectionKeepAliveStrategy() {

public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
long keepAliveDuration = super.getKeepAliveDuration(response, context);
if (keepAliveDuration == -1) {
keepAliveDuration = 45 * 1000; // 45 seconds
}
return keepAliveDuration;
}
};
CloseableHttpClient closeableHttpClient = HttpClients.custom()
.setConnectionManager(connManager)
.setKeepAliveStrategy(keepAliveStrategy)
.build();

我只是想知道这是否是该库的正确用法。我这就是它的工作方式,还是我让一切变得过于复杂?

最佳答案

不确定情况是否 100% 相同,但这是我的 2 美分:

我们遇到了类似的问题(一段时间不活动后池中的连接断开)。当我们使用旧版本的 HttpClient (3.X) 时,我们使用了 http.connection.stalecheck 管理器参数,由于在连接断开时可能会出现 IOException,因此性能受到了轻微影响。使用的是封闭的服务器端。

升级到 4.4+ 后,此方法已被弃用,并开始使用 setValidateAfterInactivity,这是每次调用验证和运行时错误场景之间的中间立场:

PoolingHttpClientConnectionManager poolingConnManager = new PoolingHttpClientConnectionManager();
poolingConnManager.setValidateAfterInactivity(5000);

void o.a.h.i.c.PoolingHttpClientConnectionManager.setValidateAfterInactivity(int ms)

Defines period of inactivity in milliseconds after which persistent connections must be re-validated prior to being leased to the consumer. Non-positive value passed to this method disables connection validation. This check helps detect connections that have become stale (half-closed) while kept inactive in the pool.

如果您还控制所使用的 API,则可以根据客户端使用的时间调整保持 Activity 策略。我们使用 AWS Cloudfront + ELB 来清除已注销实例的连接,以确保在执行滚动升级时完全关闭保持 Activity 的连接。我想只要保证连接保持 Activity 状态(例如 30 秒),传递给下面的连接管理器的任何值将始终确保有效性检查将减轻任何与陈旧/过期完全相关的运行时 I/O 错误连接。

关于java httpclient连接池租约与保持 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42075870/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com