前言

之前做过一个基于 Swoole 的长连接的项目,用来实时收集 client 的一些数据。上线没多久之后发现一个问题:有时候 client 连接不上 server,握手阶段也没通过(Websocket 基于 HTTP 握手协议来建立连接的)

追踪

定位

发生问题后,第一时间进行了处理,检查了进程、日志的点,均无异常
当初上线之前是做过压测,是符合项目的用户量也有余的,然后想到了是不是有可能连接数已经接近上限了
netstat -nat|grep -i '443'|wc -l
果然连接数接近了之前压测时的值,正常情况下,是达不到这个连接数的,一个普通的时间段一个高位的连接数,最大怀疑是:连接没能及时断开,导致的堆积

解决

有了疑问就先尝试修复,之前粗略地全面看过官方手册,记得是支持心跳检测的,利用此项至少是可以避免掉一部分无效连接的,配置如下

  • heartbeat_check_interval 表示心跳检测频率,单位是秒,需要根据业务需要来设定,服务端没有主动发起心跳,连接数较多的话代价也大,所以聪明的等待 client 的消息上传,等着被撩 🤣,最后一次的信息时间点开始累积,超过限制即被关闭
  • heartbeat_idle_time 表示心跳检测如果在此项配置的时间内没有发送,连接将被关闭,单位是秒

加上配置后观察了一段时间,发现连接数终于“理性”了 😅
并且后来再没出过此类问题

出现这个问题大概有两个原因
一是用户可能没有及时关闭页面导致连接一直存在,但是已经没有意义了,关上也无妨,况且我们设有重连机制
二是两个连接中间经过或多或少的路由器以及其它设备,由于其中的某一项的断开也是很可能的

小结

使用各组件、插件等服务前最好还是大略地看一遍配置,有助于一些个性化需求的满足,出现问题后再去翻阅也是可以的,可能会给你一些启迪

参考


我不是药神
1 声望0 粉丝

爱好编程