【复盘】生产环境页面请求超时,端口连接数超过9千导致系统不可用

问题复现

最近使用 websocket 技术开发了一个反向代理客户端,要求实现如下功能

  • 客户端安装代理客户端,禁止开放端口,由服务端开放端口
  • 客户端主动连接服务端,并保持心跳连接,当心跳中断或者断连时,重新与服务端建立连接
  • 当客户端连接到服务端后,服务端随时发送请求给客户端

开发和测试环境都没有发生问题,当在客户那边使用时,客户开启了140个客户端连接,由于心跳检测和重连逻辑写的有问题,重连后不会关闭之前的连接,保留旧连接。导致与服务端的连接越来越多,最后连接激增到9千导致其他的 tcp 请求进入不到 tomcat。

由于 SpringBoot 2.2.25.RELEASE tomcat 默认的最大连接数为 8192,从而造成阻塞,导致页面请求超时。

tomcat 默认最大连接数

【复盘】生产环境页面请求超时,端口连接数超过9千导致系统不可用_第1张图片

端口连接数

[root@curry platform]# netstat -na | grep 12345 | wc -l
9007

解决办法

1、修改产生问题的代码

2、修改服务端配置文件,将 max-connections 最大连接数设置成1万,暂时解决问题

server:
  servlet:
    context-path: /
  tomcat:
    max-connections: 10000

3、使用 jetty 替换默认 tomcat, 强烈推荐

修改 pom 文件,排除调 tomcat 容器

 implementation("org.springframework.boot:spring-boot-starter-web") {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
    }
    implementation 'org.springframework.boot:spring-boot-starter-jetty:2.3.1.RELEASE'
    implementation ("org.springframework.boot:spring-boot-starter-websocket:2.3.0.RELEASE") {
        exclude module: "spring-boot-starter-tomcat"
    }

你可能感兴趣的:(坑,websocket,生产事故复盘,tomcat,springboot,源码解析)