WebSocket必须由主线程创建并管理连接,Worker仅处理纯计算任务;双方通过MessageChannel高效通信,且需同步生命周期与状态。

WebSocket 不能在 Web Worker 中直接创建,这是硬性限制。真正可行的做法是:主线程负责连接生命周期管理,Worker 专注后台计算型任务,双方通过消息通道高效协同。
主线程只管连接和转发
WebSocket 实例必须由主线程初始化,它只做三件事:
- 调用 new WebSocket(url) 建立连接
- 监听 open、message、close、error 四个基础事件
- 把原始消息(如
{ type: 'message', data: … })或连接状态(如{ type: 'connected' })通过postMessage或MessageChannel转发给 Worker
Worker 负责纯计算类后台任务
Worker 不接触网络、不操作 DOM、不打日志,只处理可离线执行的逻辑:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
解析:对收到的
event.data做JSON.parse或二进制解包 - 过滤:剔除无效字段、过期时间戳、重复指令 ID
- 聚合:把 100ms 内多条同类型上报合并为一次结构化数据
-
心跳与健康检测:维护
lastMessageTime,超时主动通知主线程重连
用 MessageChannel 提升通信效率
高频场景下,普通 postMessage 容易堆积。推荐用 MessageChannel 建立专用通道:
立即学习“Java免费学习笔记(深入)”;
- 主线程创建
const channel = new MessageChannel(),把channel.port2传给 Worker - Worker 保存该 port 并监听
port.onmessage,用于接收轻量信号(如心跳确认、断连指令) - 大体积数据(如 ArrayBuffer)仍走
postMessage(data, [transferable]),移交所有权避免拷贝
注意生命周期对齐
Worker 可能被浏览器冻结或销毁,必须与 WebSocket 状态同步:
- 页面卸载前,主线程要调用
worker.postMessage({ type: 'flush' })清空缓冲区 - 重连或切换频道时,主线程需重新发送订阅参数(如
{ channel: 'trade' }) - 未确认的指令 ID 不能只存在 Worker 内存里,要同步到主线程的
Map或 IndexedDB

















