httpClient调用失败和配置优化

简介: httpClient调用失败和配置优化

问题描述

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

问题分析

  1. 首先排查是否是我方连接池连接数不够,从200调整到500,还是会偶发报错;
  2. 后来发现可能是我方连接后线程没有释放,导致没有复现,所以新增了releaseConnect的方法和读取Entry中的内存方法,有一定效果;
  3. 最后还排查到是否是Linux的TCP连接策略可以优化,将tcp的连接复用改为true;
1. 查询连接处于TIME_WAITED状态的连接:
2. 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():关闭连接池

参考资料

  • 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


目录
相关文章
|
4月前
|
监控 前端开发 Java
分布式链路监控系统问题之执行原方法时不能调用method.invoke的问题如何解决
分布式链路监控系统问题之执行原方法时不能调用method.invoke的问题如何解决
|
Java API Spring
【异常】Feign 调用api模块直接进入fallback的问题解决办法
【异常】Feign 调用api模块直接进入fallback的问题解决办法
401 0
使用队列解决高并发下使用Client对象调用webService接口
使用队列解决高并发下使用Client对象调用webService接口
|
小程序 前端开发 JavaScript
小程序request请求回调函数异步的解决办法
小程序request请求回调函数异步的解决办法
246 0
|
应用服务中间件 Go nginx
排查go开发的HttpClient读取Body超时
记一次go httpclient [读取响应Body超时]的排查过程。 今年度解锁的第一个技能
排查go开发的HttpClient读取Body超时
|
Java 调度
【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )(二)
【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )(二)
192 0
【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )(二)
|
网络协议 Java 测试技术
一场HttpClient调用未关闭流引发的问题
一场HttpClient调用未关闭流引发的问题
一场HttpClient调用未关闭流引发的问题
|
调度
【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )(一)
【OkHttp】OkHttp 源码分析 ( 同步 / 异步 Request 请求执行原理分析 )(一)
304 0
|
监控 Java 数据挖掘
使用 SpringAOP 获取一次请求流经方法的调用次数和调用耗时
  引语   作为工程师,不能仅仅满足于实现了现有的功能逻辑,还必须深入认识系统。一次请求,流经了哪些方法,执行了多少次DB操作,访问了多少次文件操作,调用多少次API操作,总共有多少次IO操作,多少CPU操作,各耗时多少 ? 开发者应当知道这些运行时数据,才能对系统的运行有更深入的理解,更好滴提升系统的性能和稳定性。   完成一次订单导出任务,实际上是一个比较复杂的过程:需要访问ES 来查询订单,调用批量API接口 及访问 Hbase 获取订单详情数据,格式化报表字段数据,写入和上传报表文件,更新数据库,上报日志数据等;在大流量导出的情形下,采用批量并发策略,多线程来获取订单详情数据,整
265 0