已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我们是一个 B 端实时协作平台(React 18 + TypeScript 5 + Vite 5),核心交互依赖 WebSocket 长连接:光标同步、在线状态、增量文档 diff 推送。线上约 5000 并发连接,平均在线时长 45min,心跳间隔 15s(前端主动发 ping,后端回 pong)。
【现象与卡点】
【已尝试的排查与结果】
navigator.onLine + visibilitychange 做粗粒度检测——能覆盖网络切换,但覆盖不了 TCP 半开(对端已死但本地 socket 还活着)。onmessage 里做 seq 连续校验,发现 gap 时只 console.error,没有上报到监控平台。【期望得到的答案形态】 希望社区里做实时协作、IM、或 WebSocket 监控的朋友能给一些可落地的做法,具体想看到:
setTimeout vs setInterval vs 基于 performance.now() 的漂移补偿,为什么选哪种?浏览器 tab 切后台时心跳怎么办(visibilitychange 联动)?我先把我们目前的 SDK 事件列表贴一下,方便大家对比:
ws_connect | ws_disconnect | ws_reconnect_attempt | ws_reconnect_success
ws_heartbeat_sent | ws_heartbeat_timeout | ws_message_received | ws_message_seq_gap
缺的是:ws_message_storm(flush 量 > 阈值)、ws_tab_hidden_resume(后台切回前台)、ws_message_parse_error。
欢迎直接贴代码片段或指标定义,越具体越好。