一次线上http连接被拒绝问题的排查
线上环境连第三方的HTTP服务时报连接被拒绝,单独通过curl命令发现也是返回连接被拒绝,把问题反馈给第三方后得到的答复是他们有设置最大连接数为300,要我方自查代码。
赶紧自查代码后发现确实代码有问题:
public static CloseableHttpClient newInstance(String ip_port, String userName, String password) {。。。。。此处省略无关代码CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).setDefaultRequestConfig(defaultRequestConfig).setDefaultCredentialsProvider(provider).build();return httpClient;}}
上述代码在每次调用newInstance时都创建了一个 httpClient ,如果并发高的话会导致创建大量的连接请求,最终导致第三方拒绝请求,问题找到后,赶紧将httClient修改成了单例模式,一顿操作操作猛如虎,发布到SIT环境信心满满进行测试,结果连接数量似乎是控制住了,但是多刷几次页面后又报了Timeout waiting for connection from pool,看到这个错误后马上想到是池里的连接被占用没有释放出来,于是又自查代码如下:
try {。。。此处省略无关代码String responseXml = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);。。。此处省略无关代码} catch (Exception e) {throw e;}
使用了EntityUtils.toString对返回的body进行处理,追踪进入EntityUtils.toString的源码后,发现其有在finally中关闭流,到此似乎有点懵了,线索断了。只好再次深翻错误日志,发现在抛出Timeout waiting for connection from pool错误之前已经有抛出自定义的异常了,然后根据异常堆栈信息追查到代码处后豁然开朗:抛出异常后不会走上述代码的EntityUtils.toString自然也就没有释放连接了,最终修改如下:
try {。。。此处省略无关代码String responseXml = EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);。。。此处省略无关代码} catch (Exception e) {throw e;}finally {EntityUtils.consumeQuietly(response.getEntity());}
再次测试OK。
总结一下:
在实际项目中如果没有考虑到对HttpClient或者CloseableHttpClient进行正确的释放连接操作,则会带来生产问题,后面的请求一直无法获取到连接资源,导致并发起不来。很多同学可能并没有遇到过这个问题是因为HttpClient或者CloseableHttpClient并不是单例的,而是每次使用时都创建新的实例,在正常情况下你可能正确地释放了连接,但一定要考虑到异常情况下的连接释放,正确的做法是确保释放连接的操作是在finally块中。
另外对于HttpClient或者CloseableHttpClient的创建还是不要太随意,尽量使用一个全局的(除非你有迫不得已的原因),同时设置好连接池等相关优化配置,这里着重解释下连接池配置的两个重要参数,MaxTotal表示池里最大的连接数量,DefaultMaxPerRoute按字面理解是每个路由的最大连接数(其实就是你对同一个目标服务器请求的最大连接数),此处千万不要被MaxTotal所迷惑,一定要结合DefaultMaxPerRoute参数来判断最大连数是多少。
另外CloseableHttpClient中的execute()有多个重载方法,而实际调用后能释放资源的execute必须是包含ResponseHandler<? extends T>这个属性的,否则和原有HttpClient方式是一样的。在使用EntityUtils.toString()方法时,虽然其底层调用会执行InputStream关闭流,但是这里也可能是坑之所在,当你请求第三方超时或其他异常时,会直接跳过,并没有执行上面的toString()方法,那么就不会释放连接资源。
针对CloseableHttpClient有下述两种释放连接的方案:
1、确保释放连接的操作是在finally块中。
2、使用包含ResponseHandler这个属性的execute方法
一次线上http连接被拒绝问题的排查相关推荐
- gta5线上显示无法连接服务器,gta5线上模式连接不上怎么回事_gta5线上模式进不去如何解决...
最近有很多玩家都喜欢在电脑中玩这款gta5网络游戏, 但是在玩的时候经常会遇到一些问题,比如常见的gta5线上模式连接不上的现象,这是怎么回事呢,针对此问题,本文告诉大家gta5线上模式进不去解决方法 ...
- 原创|面试官:线上服务器CPU占用率高如何排查定位问题?
国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下: 排名前几的比较受重视的能力分别为:解决问题 ...
- 服务器定位cpu高占用率代码php,面试官:线上服务器CPU占用率高如何排查定位问题?,...
面试官:线上服务器CPU占用率高如何排查定位问题?, 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果 ...
- 面试官:线上服务器CPU占用率高如何排查定位问题?
开发十年,就只剩下这套架构体系了!! 国外开发者平台 HankerRank 发布的 2018 年开发者技能调查报告中有一项关于"雇主最看重哪些核心能力"的调查,结果显示如下:  ...
- 线上服务器CPU占用率高如何排查定位问题?
(关联着看看这篇文章:https://blog.csdn.net/u011277123/article/details/103768939) 解决问题的能力以超高比例排名第一,这也是为什么很多面试过程 ...
- 线上服务Java进程假死快速排查、分析
线上服务Java进程假死快速排查.分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下: 请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响 ...
- mysql在线检测失败_一则线上MySql连接异常的排查过程
Mysql作为一个常用数据库,在互联网系统应用很多.有些故障是其自身的bug,有些则不是,这里以前段时间遇到的问题举例. 问题## 当时遇到的症状是这样的,我们的应用在线上测试环境,JMeter测试过 ...
- 线上 mysql连接超时_线上环境数据库连接超时原因
查看线上日志发现了如下的异常: ERROR 500.jsp - Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.Com ...
- 记一次线上应用连接池满的处理
记一次线上应用dubbo-claim连接池满的处理 首先看到dubbo-claim应用突然大面积报错,基本反馈是冻结预算出问题了,看了看冻结预算的代码,发现写的非常复杂,果断放弃看代码来排查问题. C ...
最新文章
- fail-fast和fail-safe的介绍和区别
- 手动编写第一个javaWEB文件
- Rman duplicate数据库复制(单系统)
- Zuul1.0和2.0我们该如何选择?
- 最美四门轿跑车斯柯达Coupe面世,CC也害怕。
- RabbitMQ消息
- mysql与jmeter环境变量配置_Java开发技术大杂烩(一)之Redis、Jmeter、MySQL的那些事...
- 基于SpringMVC+EasyPoi,采用Excel模板方式实现Excel在线预览和导出(2021版)
- Adobe Reader 2019 Offline Installer, Free Download - Best PDF Reader
- learn from 德国老师
- android更新版本下载安装,Android版本更新下载apk自动安装的方法
- matlab中ix是什么意思,详解pandas中iloc, loc和ix的区别和联系
- 服务器的四个网卡虚拟一个网卡,一种物理网卡虚拟成多个虚拟网卡的方法及系统...
- SQL VIEW(视图)介绍
- 非常适合新手的一个Python爬虫项目: 打造一个英文词汇量测试脚本!
- 人人都是产品经理读书笔记
- Code bloat has become astronomical
- rust实现wss访问_改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
- 前端 vue 制作一个日历(一)
- 【Proxyee-down】一款比IDM还强大的下载器!
热门文章
- 消费升级背景下零食行业发展报告_一份来自商务部的零食报告,2020年零食行业总产值规模将达3万亿!...
- Oracle CEO在耶鲁大学的演讲:退学吧!- - -
- c语言中文网中的字符s,strerror_s
- 华住旗下施柏阁将与保时捷设计打造联名奢华酒店;希尔顿酒店及度假村首次亮相长沙 | 全球旅报...
- 大佬的QT武林秘籍(整理)
- HTTPS网站发起HTTP请求
- 保本≠不亏钱!巴菲特教你如何平衡投资收益与风险
- nginx+rtmp实现视频直播
- JAVA日期转换工具类
- 神目推出3D结构光人脸识别模组