问题描述
利用httpclient调用云平台接口偶发报错:connection timed out,我方的time waited连接较多。
问题分析
- 首先排查是否是我方连接池连接数不够,从200调整到500,还是会偶发报错;
- 后来发现可能是我方连接后线程没有释放,导致没有复现,所以新增了releaseConnect的方法和读取Entry中的内存方法,有一定效果;
- 最后还排查到是否是Linux的TCP连接策略可以优化,将tcp的连接复用改为true;
1. 查询连接处于TIME_WAITED状态的连接: 2. netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c
- 最后排查发现是网卡丢包,和现场实施人员确认,最近有扩容过设备,导致连接异常;
- 在丢包率较大的时候,通过重写retryHandler方法来对connecttion timed out的excepion进行重试;
解决方案
- 读取Entry中所有数据后,主动释放连接,同时开启linux服务器的time_waited状态复用设置;
- 针对网卡丢包的问题,实现retryHandler,满足connecttion timed out异常情况下的重试机制;
问题总结
超时设置
connectionTimeout:连接超时,表示的是我端到对端简历 tcp的连接超时
SocketTimeout:读取到时,表示已经连接上了,但是读取对端数据超时
关闭连接的方式:
response.close():关闭连接
method.releaseConnection():释放连接
httpClient.close():关闭连接池
参考资料
- HTTP 高并发场景下的 TCP 参数优化:https://xujiyou.work/其他/计算机网络/TCP/HTTP高并发场景下的TCP参数优化.html
- Apache HttpClient两种重试机制实现HttpRequestRetryHandler和ServiceUnavailableRetryStrategy:https://juejin.cn/post/7099646330481410085#heading-9(介绍了如何设置重试处理器和重试策略)
- HttpClient的使用与连接资源释放:https://juejin.cn/post/7078658461407379463
- HttpClient 在vivo内销浏览器的高并发实践优化:https://zhuanlan.zhihu.com/p/552220565