一套覆盖采集、压缩、传输、存储、回放全链路的自研 Web 页面操作回放系统,面向排障、质检与行为分析场景,覆盖 DOM 变化、鼠标/输入/滚动、网络请求与 console 日志的全维度采集。最硬的三项指标:自研二进制协议较 JSON+gzip 方案再省 50% 以上流量,主线程单帧录制开销压到 1ms 以内,弱网断线场景数据零丢失。pnpm monorepo 按 protocol / recorder / uploader / core / player / sdk 五层严格依赖分层,12 个包、65 个测试文件。
项目特点
- 快照 + 增量事件流模型:全量快照作为 checkpoint,之间只传最小操作单元的增量事件;单事件自包含、无 patch 链式依赖,局部 apply 失败不污染后续回放。
- 自研二进制协议:字符串字典编码 + 自定义 varint + gzip 三级压缩,较 JSON+gzip 方案再省 50% 以上;chunk 头部带 1 字节协议版本,支持协议演进。
- 采集节制:鼠标轨迹抽稀至约 20fps,输入 300ms 防抖合并终态;事件流按 30s / 500 条 / 编码后 256KB 三条件切分 chunk。
- 弱网兜底:上传失败指数退避重试 3 次后落 IndexedDB(50MB FIFO)启动补传并幂等去重;pagehide 时 IDB 写 + sendBeacon 双通道防丢失。
- 回放体验:checkpoint 组为独立解码单元(组基字典 + 每 chunk 自包含声明),支撑任意时间点随机 seek 与 2x/3x/5x 快进,分片懒加载。
技术难点
流量与还原度的矛盾。 高频全量快照流量扛不住,纯增量又无法随机定位。解法是 checkpoint 稀疏化——活跃期每 5 分钟或 DOM 节点变化超 50% 才触发一次全量快照,摊薄后 checkpoint 流量占比不足 10%,同时保证任意 seek 锚点存在。
容错性根因。 v1 是 immutable 双状态树 + 整树 diff 模型:补丁链一环失效则后续全部错乱,且无法随机 seek。v2 整体重构为快照 + 事件流,事件自包含是容错与 seek 能力的共同基础。
端侧性能预算。 录制不能拖慢业务页面:主线程单帧录制开销压到 1ms 以内,万级节点的 checkpoint 序列化分片执行(requestIdleCallback 让出主线程),P95 小于 200ms,SDK gzip 体积目标 40KB 以内。
页面生命周期的末端可靠性。 用户关页瞬间是数据丢失的高发点:pagehide 时 IndexedDB 写入与 sendBeacon 双通道并发,任一路径成功即可,补传时按事件 ID 幂等去重。