协同编辑
协同以 MUTATION 为同步原子,配合 版本号 / revision、OT 或 CRDT 类合并(具体算法以 Univer 协同包为准),经 RPC / WebSocket 在客户端与协同服务间传递。
1. 架构角色
| 角色 | 职责 |
|---|---|
| 本地 Client | 产生 MUTATION、应用远端 MUTATION |
| 协同服务 | 排序、广播、持久化 revision |
| 存储 | Snapshot + 增量 revision 日志 |
2. 为何用 MUTATION
- 与 Undo、命令拦截 同一抽象。
- 粒度小于整表 snapshot,带宽更优。
- 可重放:新客户端从 snapshot + revisions 追赶。
3. 版本与冲突
- 每个 unit 维护 revision(单调递增)。
- 本地提交带「基于 revision」;服务端拒绝或合并过期操作。
- 冲突策略:常见为 服务端权威序 + 客户端回滚重放;细节见官方协同文档。
4. 用户态同步
光标、选区、在线用户列表多为 OPERATION 或独立 presence 通道,不进持久快照,降低噪音。
5. 权限
插件层可拦截 Command:只读、区域锁定、禁止改结构等,在 MUTATION 落地前拒绝。
6. 离线与重连
- 离线队列缓存本地 MUTATION。
- 重连后 拉取缺失 revision 再提交队列;冲突时以服务端为准并刷新本地 Model。
7. 性能
- 合并连续小 MUTATION(debounce)。
- 大粘贴拆批或专用 COMMAND。
- 公式重算与协同应用解耦,避免阻塞收包。
8. 总结
协同 = MUTATION 流 + revision;实现功能时保证每条远端变更都能映射为已注册的 MUTATION 类型。