http连接未释放导致生产故障

     凌晨4点运维老大收到报警(公司官网页面超时,上次故障因为运维修改nginx导致官网域名下某些接口不可用后,运维在2台nginx服务器上放了检测程序,检测官网页面),运维自己先看了看服务器相关配置,后来还是给研发打电话确认问题。    

     大早上7点领导给打电话,那会儿娃还在睡觉...我还以为是垃圾电话,怕把孩子吵醒直接挂了,吃完早饭才看见技术群爆了,生产服务报警....几个研发运维小伙伴一起讨论方案,初步认为昨天发版导致的问题,优先恢复业务,最快就是回滚服务,但不严谨的是7:38只回退了 1个微服务节点,另一个节点后来也报警8:17回退,至此运维看阿里云监控tcp连接数才降下来,期间还有oom报警。具体原因还在定位。

原因分析:   

微服务里发版的内容无非是增加了一个第三方服务的调用(腾讯云的推送服务),找到代码确认问题还比较好定位,调用im的http接口用的 cn.hutool.http 工具类,但并未设置连接超时和读超时。本地测试了一下 这个工具类默认超时时间20s多,而从凌晨4点开始腾讯云接口超时,导致我们自己的微服务一直等待20s后超时。

 try {String response = HttpUtil.createPost("http://192.168.126.10:903/test").contentType(MediaType.APPLICATION_JSON_VALUE).body("{}").execute().body();} catch (Exception e) {e.printStackTrace();System.out.println(System.currentTimeMillis() - start);}

加上超时时间的设置 .timeout(3000)

String response = HttpUtil.createPost(requestUrl).contentType(MediaType.APPLICATION_JSON_VALUE).body(json.toJSONString()).timeout(3000).execute().body();

     但腾讯云接口为啥会连接超时呢,如果接口本身是连通的且响应比较快应该也不会发生后面一系列问题。腾讯的im服务分级别,普通服务可能有限制,比如每秒200次请求;但我们的推送并没有达到腾讯的频率阈值,为什么报连接超时,即便达到阈值,对方也应该会立即返回一个错误码,而不会出现连接超时的错误,即便设置超时时间,好像还是不能说明到底为什么会有connect timeout的问题;那问题到底在哪儿呢?

     问题还是在最初的连接数暴涨上,查看我们自己的nat网关才发现连接数今天凌晨开始在持续增加,直到打满了达到了阈值(1w左右),达到阈值后,后面再调用外部接口获取不到可用连接,过了默认的连接超时时间,自然就连接超时了。

     那为什么连接数会暴涨?理论上大厂腾讯的接口应该很快,不会出现响应慢一直占着连接的情况,那只有一种可能我们调用对方接口时,请求结束并未释放连接。果然发现代码少了close操作

finally {
            if (httpResponse != null) {
                httpResponse.close();
            }
        }

经验教训

(1)凡是对接第三方接口的需要设置超时时间

(2)操作资源时记得及时关闭,比如数据库连接,redis连接,文件句柄等等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java实现STL中的全排列函数next_permutation()

目录 一、引言 二、全排列函数next_permutation() 三、next_permutation()的使用 四、Java实现next_permutation() 五、使用next_permutation()实现全排列 一、引言 相信很多小伙伴们都做过全排列的算法题,输入一个n,输出1~n的全排列。对于这个问题…

k8s相关命令

一、Kubectl是什么 控制K8S通信的命令工具。 格式: kubectl [command] [TYPE] [NAME] [FLAGS] 二、Kubectl命令 1.查看容器命令 kubectl get pod kubectl get pod -n default #查看当前的命名空间的pod kubectl get pod -A #查看所有命名空间的pod kubectl de…

.Net插件开发开源框架

在.NET开发中,有许多开源框架可以用于插件开发,以下是一些最常见的框架: MEF(Managed Extensibility Framework) MEF是一个用于创建可插拔软件应用程序的库,它可以在不修改原始应用程序的情况下扩展应用程…

JVM 有哪些垃圾回收器?

JVM 有哪些垃圾回收器? 图中展示了7种作用于不同分代的收集器,如果两个收集器之间存在连线,则说明它们可以搭配使用。虚拟机所处的区域则表示它是属于新生代还是老年代收集器。 新生代收集器(全部的都是复制算法)&…

【安全靶场】-DC-7

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 一、收集信息 1.查看主机是否存活 nmap -T4 -sP 192.168.216.149 2.主动扫描 看开放了哪些端口和功能 n…

【网络】UDP和TCP之间的差别和回显服务器

文章目录 UDP 和 TCP 之间的差别有连接/无连接可靠传输/不可靠传输面向字节流/面向数据报全双工/半双工 UDP/TCP API 的使用UDP APIDatagramSocket构造方法方法 DatagramPacket构造方法方法 回显服务器(Echo Server)1. 接收请求2. 根据请求计算响应3. 将…

JVM分代回收

JVM分代回收 堆中分为两份:新生代和老年代(1:2) 新生代 新生代的内部分为了三个区域 Eden区,From区,To区[8:1:1] 当eden区内存不足时,就会使用可达性分析算法进行标记 标记eden区和from区的存活对象 将这些对象复制到to区,对eden区和from区进行清除 如果eden下次又出现…

黑马头条vue2.0项目实战(十一)——功能优化(组件缓存、响应拦截器、路由跳转与权限管理)

1. 组件缓存 1.1 介绍 先来看一个问题? 从首页切换到我的,再从我的回到首页,我们发现首页重新渲染原来的状态没有了。 首先,这是正常的状态,并非问题,路由在切换的时候会销毁切出去的页面组件&#xff…

Java之HashMap的底层实现

Java之HashMap的底层实现 摘要HashMap的底层原理哈希值转换为数组下标节点初始化put(Object key, Object value)重写toString()get(Object key)增加泛化remove(K key) 摘要 本博客主要讲述了Java的HashMap的底层实现 HashMap的底层原理 底层原理:数组链表 过程…

【ARM 芯片 安全与攻击 5.6 -- 侧信道与隐蔽信道的区别】

文章目录 侧信道与隐蔽信道的区别侧信道攻击(Side-channel Attack)侧信道攻击简介侧信道攻击 使用方法侧信道攻击示例隐蔽信道(Covert Channel)隐蔽信道简介隐蔽信道使用方法隐蔽信道代码示例侧信道与隐蔽信道在芯片及系统安全方面的使用侧信道的应用隐蔽信道的应用Summary…

【C/C++】菱形继承问题

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

python进阶语法---异常处理

在 Python 中&#xff0c;异常处理是一种机制&#xff0c;用于处理程序运行时可能发生的错误&#xff0c;以确保程序能够优雅地处理错误情况&#xff0c;而不是直接崩溃。异常处理机制的核心是使用 try、except、else 和 finally 语句。 一、基础语法 异常处理的基本语法如下…

【JAVA CORE_API】Day18 网络编程、线程、在线聊天室v1.0

C/S&#xff1a;客户端/服务器端&#xff0c;所有网络应用都是基于客户端服务器端进行的&#xff0c;Java写的是服务端&#xff0c;客户端是一个软件&#xff0c;服务端也是一个软件&#xff0c;两个软件之间交互&#xff1b;&#xff08;只能连接对应的服务器&#xff09; B/…

深度学习-k-mean实现聚类

对模拟函数生成的随机数据&#xff0c;分为三个族群。 1.生成数据 设定样本数量、特征数、族群数&#xff0c;以及簇内标准差之后&#xff0c;通过make_blobs生成随机数据。 scikit-learn库中的make_blobs函数来生成模拟数据集的&#xff0c;用于创建多类单标签数据集&#…

吐血整理 ChatGPT 3.5/4.0/4o 新手使用手册~

都知道ChatGPT很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;无所不能~ 那么到底怎么使用呢&#xff1f;其实很简单了&#xff0c;国内AI产品发展也很快&#xff0c;很多都很好用了~ 我一直在用&#xff0c;建议收藏下来~ 有最先进、最…

基于 Appium 的 App 爬取实战

除了运行 Appium 的基本条件外&#xff0c;还要一个日志输出库 安装&#xff1a; pip install loguru 思路分析 首先我们观察一下整个 app5 的交互流程&#xff0c;其首页分条显示了电影数据&#xff0c; 每个电影条目都包括封面&#xff0c;标题&#xff0c; 类别和评分 4…

Godot《躲避小兵》实战之创建玩家场景

项目设置完之后&#xff0c;我们就可以开始处理玩家控制的角色。 这里我们将玩家放在一个单独的场景当中&#xff0c;这样做的好处是在游戏的其他部分做出来之前&#xff0c;我们就可以对其进行单独测试。 节点结构 场景是一个节点树结构&#xff0c;因此一个场景需要有一个…

GitHub每日最火火火项目(8.21)

goauthentik / authentik&#xff1a; 项目介绍&#xff1a;authentik 是一个提供认证功能的工具&#xff0c;它似乎是 GitHub 社区当前非常关注的项目。虽然关于它的具体功能和特点在给定的文本中没有详细说明&#xff0c;但可以推测它在认证方面具有重要的作用&#xff0c;可…

WordPress美化节日灯笼插件,适合春节的时候使用

源码介绍&#xff1a; WordPress美化节日灯笼插件&#xff0c;适合每年过年的时候安在网站上使用&#xff0c;这款插件可以备用着&#xff0c;一款WordPress节日灯笼美化插件&#xff0c;可以给网页自动加一个灯笼效果使用说明&#xff1a;到网站WP后台 - 插件 - 安装插件 - 上…

Linux外设接口使用及内核驱动开发---模拟Framebuffer及应用接口

文章目录 前言一、模拟Framebuffer驱动1.总体功能2.驱动代码3.简要说明二、应用层1.总体功能2. 例子代码主函数三.运行结果前言 驱动端实现Linux模拟Framebuffer驱动;应用端采用GTK+实现多个应用程序通过接口/dev/fbXXX访问Framebuffer.基于该接口,可以在PC电脑Ubuntu系统实…