心跳检测
服务端主动发送心跳
SuWS
服务端每30秒向客户端发送一次WebSocket协议标准的PingMessage心跳帧
,防止连接因空闲被中间网络设备断开。
现代的WebSocket客户端,协议层默认会自动处理 PingMessage心跳帧
,并自动回复PongMessage心跳帧
,无需应用层额外处理。
客户端主动发送心跳
如您的WebSocket客户端,不支持自动处理 PingMessage心跳帧
,或业务层需要自定义心跳逻辑。
推荐您可以每 30
秒,向服务端发送一个 PingMessage心跳帧
,服务端收到此帧后,会自动回复 PongMessage心跳帧
。
或者, 您也可以每 30
秒,向服务端发送一个 ping
字符串,服务端收到此字符串后,会自动回复 pong
字符串。
SuWS心跳检测机制
SuWS运行后,会启动一个独立运行的goroutine heartbeatRoutine()
,负责监控所有 WebSocket 客户端连接的活跃状态。 它通过定期检查客户端的最后心跳时间来检测连接是否超时,并自动断开不活跃的连接。
核心机制
- 检测频率:每
3
秒执行一次检测循环 - 超时阈值:
45
秒(客户端最后心跳时间超过此值将被断开) - 动态间隔:检测频率根据当前连接数动态调整
工作流程
定时检测
- 使用
3
秒间隔的定时器触发检测逻辑 - 通过计数器和
calculateHeartbeatInterval()
控制实际检测频率
- 使用
连接状态检查
- 遍历所有已连接的客户端
- 读取每个客户端的最后心跳时间
LastPing
- 计算当前时间与最后心跳时间的差值
超时处理
- 若差值超过
45
秒,将客户端标记为超时 - 将超时客户端加入注销队列进行断开处理
- 若差值超过
动态频率调整
检测频率通过 calculateHeartbeatInterval()
方法根据当前在线客户端数量动态调整:
在线客户端数量范围 | 检测间隔(秒) |
---|---|
< 100 | 3 |
100 - 499 | 6 |
500 - 999 | 9 |
1000 - 4999 | 12 |
5000 - 9999 | 15 |
≥ 10000 | 18 |
技术特点
- 并发安全:使用读写锁保护客户端列表和客户端状态的并发访问
- 资源优化:通过动态调整检测频率减少高并发时的系统开销
- 自动清理:超时连接自动加入注销队列,由
Hub
统一处理资源释放 - 日志记录:记录超时断开的客户端信息,便于问题排查
超时策略
- 心跳周期:客户端每
30
秒发送一次心跳 - 容忍时间:
15
秒(1.5 倍心跳周期) - 总超时时间:
45
秒(30 秒 + 15 秒)
该策略确保在网络短暂波动时不会误断连接,同时能及时清理真正失效的连接。