gpt4 book ai didi

java - 实现 HTTP 连接池的正确方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:08:09 25 4
gpt4 key购买 nike

在 REST API 调用某些网络服务期间,我使用 Apache HTTP 客户端进行连接池。

奇怪的是,尽管我使用了 HTTP 连接池,但我的性能没有任何提升。

我正在使用 Apache HTTP Client连接到我的网络服务,代码如下documentation :

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();

cm.setMaxTotal(200);

cm.setDefaultMaxPerRoute(20);

HttpHost host = new HttpHost("abc.com", 80);
cm.setMaxPerRoute(new HttpRoute(host), 50);

CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(cm)
.build();

我使用 Spring 的 RestTemplate 来包装 Apache 的 HttpClient 实现,使用 Spring 的 HttpComponentsClientHttpRequestFactory

但即使我不使用连接池,即。使用 Spring 的 SimpleClientHttpRequestFactory,我没有任何性能优势。

我的连接仍然需要相同的时间才能完成。

我所做的是实现 HTTP 连接池的正确方法吗?我做错了什么吗?

如果我需要任何进一步的信息,请告诉我。

最佳答案

注意 HTTP 客户端池的工作方式,它可能会在短时间内提高性能。检查以下分析:

来自 PoolingHttpClientConnectionManager javadocs

The handling of stale connections was changed in version 4.4. Previously, the code would check every connection by default before re-using it. The code now only checks the connection if the elapsed time since the last use of the connection exceeds the timeout that has been set. The default timeout is set to 2000ms

从池性能的角度来看,这意味着只要管理器默认在 2 秒内将该路由视为“Activity ”,就会重用到特定路由的连接。
在 2 秒不活动后,到该路由的连接将被视为过时并被丢弃,因此在下次请求该路由时会导致连接初始化惩罚。

换句话说,开箱即用,池在 2 秒内提高了第一次连接后的性能。重型航线受益最大。

作为一个简单的测试,将您的池大小设置为较小的值,例如最大 5。在 linux 上发送 5 个请求并检查到该路由的已建立连接数

watch "netstat -ant | grep <your route IP>"

您应该看到 5 个连接。等待 10 或 20 秒并向同一路由发送 2 个请求,您应该会看到这 5 个连接已关闭并新建了 2 个。也可以通过调试日志记录来观察。 Here是一篇很好的引用文章。
Apache 官方文档 http logging .

关于java - 实现 HTTP 连接池的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50890024/

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