技术面试题

飞书实时协同编辑与CRDT

"如何为飞书实现实时协同文档编辑,确保数百人同时编辑时的一致性?"

为什么面试官会问这道题

飞书是字节跳动对标Google Workspace和Microsoft 365的旗舰企业产品,实时协同是其核心差异化优势。这道题考察你对分布式系统基础——冲突解决、最终一致性和延迟优化的理解。

如何回答

  1. 1

    对比OT(操作变换)和CRDT(无冲突复制数据类型),解释为什么CRDT因更简洁的冲突解决保证而越来越受青睐。

  2. 2

    描述文档模型:块构成的树(段落、表格、图片),每个节点包含基于CRDT的文本序列。

  3. 3

    解释同步协议:本地编辑立即应用,通过WebSocket发送到服务端,服务端合并后广播给其他客户端。

  4. 4

    讨论实际问题:CRDT下的撤销/重做、光标感知、离线编辑和重连同步。

参考回答示例

我会采用CRDT方案,具体使用Yjs的变体或自研的RGA(可复制可增长数组)实现文本序列。每个字符获得由客户端ID和逻辑时钟组成的唯一标识,确保无需中心权威即可确定性地合并排序。文档建模为CRDT节点树——每个段落是一个RGA,表格是单元格引用的CRDT Map,富文本格式用基于标记的方式将格式区间附加到字符ID上。同步层面,客户端通过WebSocket连接协同服务器。本地编辑乐观地应用到客户端状态,并作为delta操作发送。服务端用CRDT合并函数合并传入的delta后广播给所有连接的客户端。离线支持方面,客户端累积本地操作,重连时同步——CRDT保证无论操作顺序如何都能收敛。光标位置和选区等感知功能通过轻量级presence通道单独广播,100ms节流以减少网络开销。

实用技巧

  • 弄清OT和CRDT的区别——OT需要中心服务器做变换,CRDT可以独立合并。

  • 提到Yjs或Automerge等真实CRDT库来展示实践经验。

  • 讨论CRDT的内存开销(已删除字符的墓碑)和垃圾回收策略。

常见问题

CRDT相比OT在协同编辑中的主要优势是什么?

CRDT从构造上保证收敛——任何操作顺序都产生相同的最终状态。OT需要中心服务器做操作变换,引入单点故障,也让离线编辑更难实现。

在基于CRDT的编辑器中如何处理光标位置?

光标表示为两个字符ID之间的相对位置,而非绝对偏移。这样当其他用户插入或删除文字时,光标位置在语义上保持正确,无需显式变换。

面试时担心忘词?即答侠实时助你

即答侠 AI 实时监听面试对话,自动识别问题并即时生成回答建议——无感辅助,让你从容应对每一道题。

免费试用即答侠