worker容错机制需主动探测、安全销毁、可控重启并留痕可观测:1.双向心跳检测;2.软终止加强制兜底;3.带退避与中断的可控重试;4.暴露健康指标与事件。

主动心跳检测:让 Worker 定期“报平安”
Worker 本身不暴露存活状态,需手动建立双向心跳。主线程定时发 { type: 'ping' },Worker 收到后必须在限定时间内(如 2 秒内)回传 { type: 'pong', ts: Date.now() }。
- 主线程用
setInterval每 3 秒发一次 ping,记录发送时间戳 - 收到 pong 后清空超时定时器;超时未响应即触发异常流程
- 避免单向轮询——Worker 也要主动上报关键状态(如内存占用、任务队列长度)
软终止 + 强制兜底:安全销毁再重启
直接 worker.terminate() 可能中断正在执行的同步逻辑,或遗留未清理的定时器和事件监听。
- 先发
{ type: 'shutdown', grace: 500 },通知 Worker 主动退出并释放资源 - 启动一个 800ms 的兜底定时器,到期检查
worker.onmessage是否已置为null - 未关闭则调用
terminate()彻底释放,随后将引用设为null
可控重试:防雪崩、带退避、可中断
无限制重启会掩盖真实问题,甚至拖垮主线程。
- 最大重试次数设为 3 次,超过即停止自动恢复,抛出错误供上层决策
- 延迟递增:第 1 次等待 100ms,第 2 次 300ms,第 3 次 900ms(指数退避)
- 提供
stopAutoRetry()方法,支持业务侧主动中止(如页面卸载、任务取消) - 每次重启前检查环境:网络是否在线、内存是否充足、主线程负载是否过高
状态可观测:暴露指标,便于定位与监控
健康机制本身也要可诊断,否则无法区分是 Worker 崩了,还是检测逻辑失效。
- 对外暴露只读属性:
isAlive(基于最近 pong 时间)、uptimeMs、restartCount、lastError - 重启时派发自定义事件
workerhealth:restart,附带原因和上下文 - 配合 PerformanceObserver 或自定义日志埋点,长期跟踪稳定性趋势










