中文 EN

系统设计 Lab

当 edit ordering 成为约束时,Google Docs 的设计就会改变形态。

从一篇可编辑的文档开始。逐步增加协作者、offline 时长和读者 fanout,看看为什么这套设计需要 WebSocket 路由、一个 document room、OT/CRDT、一条 operation log、snapshot,以及一条独立的 presence 路径。

分步讲解

一步一步把它想清楚

常规演进场景

从左到右点击,就是预设的演示路径。每张卡片都会改变 workload 输入。

Workload

这些是输入,不是预设好的架构阶段。

推荐形态

当前架构路径
Google Docs 协同编辑架构图 白板风格的架构图,展示实时文档协作中的 room ordering、operation transform、log、snapshot 和 presence fanout。 客户端 实时 edge 文档协调 恢复 存储 + fanout Browser 本地乐观编辑 WebSocket auth + 文档路由 Doc room 权威顺序 OT / CRDT 修复过期位置 Op log durable 版本 Snapshotter 快速恢复 Doc store metadata + blob Presence best-effort fanout 历史 版本 + audit
客户端
Browser 乐观地应用本地编辑并发送 operation
实时 edge
WebSocket gateway 维持连接,并按 document id 路由
文档协调
Document room 为单篇文档的 operation 串行排序
OT / CRDT 修复过期位置,或合并 offline 编辑
恢复
Operation log durable 的有序历史
Snapshotter 定期做整篇文档的 checkpoint
存储 + fanout
Document store metadata、权限和当前正文 blob
Presence fanout 短暂的光标和浏览者 broadcast
历史 版本历史和恢复数据

瓶颈

Room throughput

stale-operation 风险

Operation log

Presence fanout

恢复成本

为什么会变

    决策权衡

    WebSocket edge

    Document room

    OT / CRDT

    Durable op log

    Snapshot

    Presence 路径

    有出处支撑的规则

    这些是模型背后那些经得起时间考验的 system design 论断。而 slider 的具体阈值,则被刻意标注为教学用的假设。

    已验证的规则

    WebSocket 适合低延迟的双向协作

    browser 和 server 都需要发消息,而不必为每次编辑或光标更新都开一个新的 HTTP 请求。

    MDN Web Docs
    已验证的规则

    每个文件一个权威方,能让协作的 ordering 保持可理解

    Figma 介绍了把同一个文件的所有客户端都路由到一台 multiplayer server,从而让系统对该文件有一个清晰的协调点。

    Figma Engineering
    已验证的规则

    OT 会对那些基于旧版本生成的 operation 做变换

    operational transform 会把进来的 operation 相对已经发生的改动做调整,正好对应这个 lab 里的 stale-position 风险。

    TinyMCE
    已验证的规则

    CRDT 用可合并的数据结构换掉了中心化的 transform

    基于 CRDT 的编辑器会附带稳定的 ordering metadata,于是即便 operation 以不同顺序到达,各 replica 也能合并编辑并最终收敛。

    System Design Sandbox

    教学用假设

    • 这些阈值是教学用的阈值,不是 Google 的生产数字。
    • 单个 document room 是编辑的 ordering point;大规模的读取或 presence fanout 可以从这个 room 拆出去。
    • presence 被建模成 best effort,因为光标更新是短暂的,跟文档 operation 不一样。