HttpClient,ConnectionManager和奇怪的池限制

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

我的WebApp使用AWS S3服务作为一堆文件的存储。当请求进来时,正在使用Jets3t库从S3获取适当的文件,该库使用ASF HttpClient。问题是HttpClient连接管理器使用一些奇怪的池概念,强制设置每个路由的最大连接数限制和一般的最大连接数。我习惯于将其大小调整为传入需求,但它在HttpClient中不起作用。因此,当达到池限制时,请求将保持不变,直到连接空闲为止。这在某种程度上默默地降低了我的WebApp的性能(S3服务远离饱和度)。

我无法以任何方式控制来到我的WebApp的大量请求,因此任何提出合理的最大连接限制的努力都是徒劳的。即使当某个值对于当前负载可能正常工作时,它也会在某些快速变化到来时失败(例如,搜索引擎抓取网站)。

所以这是我的问题:

  1. HttpClient的任何(可能是第三方)连接管理器是否没有强制执行此类限制?
  2. 如果它不存在,我可以以某种方式使连接管理器报告连接池的饥饿?如果没有希望我每次都会在日志中看到一些消息时调整最大连接限制。

如果有人想建议它,我已经尝试为每个请求线程提供单独的库实例(以及HttpClient)。它工作得很好,虽然我猜它会消耗更多的资源。如果克服最大连接限制的所有努力都失败,我可能会使用这种方法。

java httpclient pool
1个回答
0
投票

org.apache.http.impl.conn.PoolingHttpClientConnectionManager实现了org.apache.http.pool.ConnPoolControl接口,该接口提供了获取当前连接池统计信息的这些方法:

  • PoolStats getTotalStats()
  • PoolStats getStats(final T route)

您可以构造传递给用于构建PoolingHttpClientConnectionManagerorg.apache.http.impl.client.HttpClientBuilderHttpClient实例,因此您可以随时引用该实例来查询统计信息。

或者,你可以创建一个记录统计数据的PoolingHttpClientConnectionManager的sublcass;例如,在requestConnection()时间(但可能只在每第n次通话后)。

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