websocket不能在web worker中直接创建,需主线程负责连接与转发,worker专注数据处理与保活;二者通过messagechannel和transferable高效通信,并协同管理生命周期以防消息丢失。

WebSocket 本身不能在 Web Worker 中直接创建,这是浏览器的硬性限制——WebSocket 构造函数只存在于主线程的 window 全局作用域,Worker 的 self 中没有它。所以“Worker 处理 WebSocket”不是让 Worker 去连服务端,而是让主线程管连接、Worker 管数据和保活逻辑,两者分工协作,才能真正扛住高频、长时、后台运行的压力。
主线程只做三件事:建连、转发、发指令
- 调用
new WebSocket(url)初始化连接,监听open/message/close/error四类事件 - 收到服务端消息后,不做解析、不过滤、不更新 UI,立刻
postMessage({ type: 'raw', data: e.data })给 Worker - 所有业务发送(比如用户输入的指令)都由主线程
postMessage({ type: 'send', payload: xxx })交给 Worker,再由 Worker 转发到 WebSocket 实例
Worker 负责纯计算与后台保活,不碰 DOM、不碰 WebSocket 实例
- 接收主线程转发的原始消息,用
JSON.parse()或TextDecoder解析,做字段校验、时间戳过滤、重复去重 - 对高频指令按策略聚合(例如 100ms 内同类型指令合并为一条上报)
- 维护本地应答队列,匹配服务端返回的
ackId,超时未响应则主动重发 - 启动独立定时器:每 25 秒发一次
{ type: 'ping' };同时记录最后收到消息时间,若超 45 秒无响应,通知主线程断连并触发重连
通信必须高效,避免 postMessage 成瓶颈
- 用
MessageChannel建立专用通道传轻量信号(心跳确认、连接状态、重连指令),主线程初始化后把port2传给 Worker - 大体积数据(如二进制行情包、Protobuf payload)走
postMessage(data, [arrayBuffer]),用Transferable零拷贝移交所有权 - Worker 内批量处理消息:收到多条先存入缓冲区,再用
queueMicrotask或setInterval定期批量解析,不逐条同步执行
生命周期要对齐,否则容易丢消息或状态错乱
- Worker 被冻结或销毁前(比如页面后台 5 分钟),未确认的消息 ID 不能只存在 Worker 内存里,得同步到主线程的
Map或indexedDB - 页面卸载或切换频道时,主线程需主动通知 Worker 清空缓冲区,并重新发送订阅参数(如
{ channel: 'market' }) - 主线程调用
worker.terminate()前,务必先worker.postMessage({ type: 'flush' }),确保最后几条待发消息不丢失
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











