Skip to content

心跳检测

服务端主动发送心跳

SuWS 服务端每30秒向客户端发送一次WebSocket协议标准的PingMessage心跳帧,防止连接因空闲被中间网络设备断开。

现代的WebSocket客户端,协议层默认会自动处理 PingMessage心跳帧,并自动回复PongMessage心跳帧,无需应用层额外处理。

客户端主动发送心跳

如您的WebSocket客户端,不支持自动处理 PingMessage心跳帧,或业务层需要自定义心跳逻辑。

推荐您可以每 30 秒,向服务端发送一个 PingMessage心跳帧,服务端收到此帧后,会自动回复 PongMessage心跳帧

或者, 您也可以每 30 秒,向服务端发送一个 ping 字符串,服务端收到此字符串后,会自动回复 pong 字符串。

SuWS心跳检测机制

SuWS运行后,会启动一个独立运行的goroutine heartbeatRoutine(),负责监控所有 WebSocket 客户端连接的活跃状态。 它通过定期检查客户端的最后心跳时间来检测连接是否超时,并自动断开不活跃的连接。

核心机制

  • 检测频率:每 3 秒执行一次检测循环
  • 超时阈值45 秒(客户端最后心跳时间超过此值将被断开)
  • 动态间隔:检测频率根据当前连接数动态调整

工作流程

  1. 定时检测

    • 使用 3 秒间隔的定时器触发检测逻辑
    • 通过计数器和 calculateHeartbeatInterval() 控制实际检测频率
  2. 连接状态检查

    • 遍历所有已连接的客户端
    • 读取每个客户端的最后心跳时间 LastPing
    • 计算当前时间与最后心跳时间的差值
  3. 超时处理

    • 若差值超过 45 秒,将客户端标记为超时
    • 将超时客户端加入注销队列进行断开处理

动态频率调整

检测频率通过 calculateHeartbeatInterval() 方法根据当前在线客户端数量动态调整:

在线客户端数量范围检测间隔(秒)
< 1003
100 - 4996
500 - 9999
1000 - 499912
5000 - 999915
≥ 1000018

技术特点

  • 并发安全:使用读写锁保护客户端列表和客户端状态的并发访问
  • 资源优化:通过动态调整检测频率减少高并发时的系统开销
  • 自动清理:超时连接自动加入注销队列,由 Hub 统一处理资源释放
  • 日志记录:记录超时断开的客户端信息,便于问题排查

超时策略

  • 心跳周期:客户端每 30 秒发送一次心跳
  • 容忍时间15 秒(1.5 倍心跳周期)
  • 总超时时间45 秒(30 秒 + 15 秒)

该策略确保在网络短暂波动时不会误断连接,同时能及时清理真正失效的连接。