飞书是字节跳动对标Google Workspace和Microsoft 365的旗舰企业产品,实时协同是其核心差异化优势。这道题考察你对分布式系统基础——冲突解决、最终一致性和延迟优化的理解。
对比OT(操作变换)和CRDT(无冲突复制数据类型),解释为什么CRDT因更简洁的冲突解决保证而越来越受青睐。
描述文档模型:块构成的树(段落、表格、图片),每个节点包含基于CRDT的文本序列。
解释同步协议:本地编辑立即应用,通过WebSocket发送到服务端,服务端合并后广播给其他客户端。
讨论实际问题: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需要中心服务器做操作变换,引入单点故障,也让离线编辑更难实现。
光标表示为两个字符ID之间的相对位置,而非绝对偏移。这样当其他用户插入或删除文字时,光标位置在语义上保持正确,无需显式变换。