我的WebApp使用AWS S3服务作为一堆文件的存储。当请求进来时,正在使用Jets3t库从S3获取适当的文件,该库使用ASF HttpClient。问题是HttpClient连接管理器使用一些奇怪的池概念,强制设置每个路由的最大连接数限制和一般的最大连接数。我习惯于将其大小调整为传入需求,但它在HttpClient中不起作用。因此,当达到池限制时,请求将保持不变,直到连接空闲为止。这在某种程度上默默地降低了我的WebApp的性能(S3服务远离饱和度)。
我无法以任何方式控制来到我的WebApp的大量请求,因此任何提出合理的最大连接限制的努力都是徒劳的。即使当某个值对于当前负载可能正常工作时,它也会在某些快速变化到来时失败(例如,搜索引擎抓取网站)。
所以这是我的问题:
如果有人想建议它,我已经尝试为每个请求线程提供单独的库实例(以及HttpClient)。它工作得很好,虽然我猜它会消耗更多的资源。如果克服最大连接限制的所有努力都失败,我可能会使用这种方法。
org.apache.http.impl.conn.PoolingHttpClientConnectionManager
实现了org.apache.http.pool.ConnPoolControl
接口,该接口提供了获取当前连接池统计信息的这些方法:
PoolStats getTotalStats()
PoolStats getStats(final T route)
您可以构造传递给用于构建PoolingHttpClientConnectionManager
的org.apache.http.impl.client.HttpClientBuilder
的HttpClient
实例,因此您可以随时引用该实例来查询统计信息。
或者,你可以创建一个记录统计数据的PoolingHttpClientConnectionManager
的sublcass;例如,在requestConnection()
时间(但可能只在每第n次通话后)。