事故描述
公司的硬件设备和设备网关服务是以 TCP 长连接方式通讯的,网关服务用到了 Netty
前段时间突然线上一批新的设备集体离线, 查看设备网关发现网关进程的 netstat 存在大量的 CLOSE_WAIT 状态连接
第一时间重启了设备网关,很快设备正常上线了,观察一段时间之后发现又开始陆续出现 CLOSE_WAIT 状态的连接
分析原因
仔细观察了一下这些连接,发现这些连接的目标地址都是阿里云的,不由得想到之前添加的一个将设备日志上报阿里云 oss 的小功能
解决问题
这个功能先是封装了一层请求阿里云 Oss 客户端的代码,然后将这个工具作为依赖引入到原有的项目中,在封装过程中想到为了避免重复创建 OssClient 引起资源消耗,所以定义了一个全局的 client,创建成功之后可以全局复用,所以没有显示调用 oss 的 shutdown()方法,正是这个想法导致了线上出现的问题;
将全局 OssClient 改为每次上传前创建,上传完毕之后调用ossClient.shutdown()方法关闭连接,问题就再没复现过