增强WebSocket断连恢复机制,优化重连策略和错误处理

This commit is contained in:
yxsj245
2026-04-07 12:35:48 +08:00
parent c2fd4be116
commit ea57018b9b
5 changed files with 263 additions and 61 deletions

View File

@@ -0,0 +1,60 @@
# WebSocket断连恢复加固说明
## 问题背景
当前面板存在一类较难稳定复现的 WebSocket 断连问题。已观察到的服务端日志如下:
```text
客户端断开连接: <socketId>, 原因: client namespace disconnect
```
在部分场景下,前端会表现为 WebSocket 长时间无法恢复,刷新页面后仍不能正常重连,最终只能重启面板。
## 本次加固内容
### 1. 前端连接恢复策略增强
修改文件:
- `client/src/utils/socket.ts`
主要调整:
- 为重连流程增加独立定时器,避免多个重连任务互相叠加
- 当连接进入异常状态时,允许重建底层 socket 实例,而不是只复用旧实例
-`client namespace disconnect` 增加恢复兜底,降低卡死在旧连接对象上的概率
- 低功耗模式、手动登出等主动断开场景会显式标记,避免误触发自动重连
- 遇到认证错误时会停止重连并跳转登录页,避免一直使用无效 token 重试
### 2. 服务端断连清理增加兜底
修改文件:
- `server/src/index.ts`
- `server/src/modules/system/SystemManager.ts`
- `server/src/modules/terminal/TerminalManager.ts`
主要调整:
-`disconnect` 时的各个清理步骤拆开执行,并分别捕获异常
- 增加 `disconnecting` 日志,便于排查断开前仍在订阅的房间
- 对系统监控与终端进程订阅检查增加异常保护,避免断连后的异步检查影响整个进程
## 预期效果
- 某些客户端主动断开后遗留的异常状态,前端可通过重建 socket 实例尝试自恢复
- 即使服务端断连清理某一步出现异常,也不会直接影响后续清理和整体 WebSocket 服务
- 后续如果再次遇到类似问题,日志里可以更快定位是“客户端主动断开”还是“断开后的清理步骤异常”
## 建议验证方式
建议优先做局部验证,不需要立刻跑整套浏览器测试:
1. 登录面板后保持首页在线,确认 WebSocket 正常建立
2. 手动触发低功耗模式进入和退出,确认连接可恢复
3. 在文件监视、系统监控、终端页面之间切换后断网再恢复,观察是否能自动或手动重连
4. 关注服务端日志中以下两类信息:
- `客户端准备断开连接`
- `客户端断开清理失败(...)`
如果后续还能复现,建议把同一时间段的这两类日志一并保留,能更快定位具体是哪一步导致恢复失败。