httpClient调用失败和配置优化

329 阅读2分钟

问题描述

利用httpclient调用云平台接口偶发报错:connection timed out,我方的time waited连接较多。

问题分析

  1. 首先排查是否是我方连接池连接数不够,从200调整到500,还是会偶发报错;
  2. 后来发现可能是我方连接后线程没有释放,导致没有复现,所以新增了releaseConnect的方法和读取Entry中的内存方法,有一定效果;
  3. 最后还排查到是否是Linux的TCP连接策略可以优化,将tcp的连接复用改为true;
查询连接处于TIME_WAITED状态的连接:
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c

  1. 最后排查发现是网卡丢包,和现场实施人员确认,最近有扩容过设备,导致连接异常;
  2. 在丢包率较大的时候,通过重写retryHandler方法来对connecttion timed out的excepion进行重试;

解决方案

  1. 读取Entry中所有数据后,主动释放连接,同时开启linux服务器的time_waited状态复用设置;
  2. 针对网卡丢包的问题,实现retryHandler,满足connecttion timed out异常情况下的重试机制;

问题总结

超时设置

connectionTimeout:连接超时,表示的是我端到对端简历 tcp的连接超时

SocketTimeout:读取到时,表示已经连接上了,但是读取对端数据超时

关闭连接的方式:

response.close():关闭连接

method.releaseConnection():释放连接

httpClient.close():关闭连接池

参考资料