常见面试题 - 如何设计Google Docs?
一图胜千言。今天我们来看看设计Google Docs的几个主要模块。
首先我们来看看功能性需求:
- 在线编辑
- 协作编辑 - 允许多人同时编辑同一个文档。
文件存储 - 支持文件系统,允许查看文档、添加文档、修改文档、删除文档。
我们先简化一下问题。如果是一个单机版的在线文档,没有多人协作的要求,那其实只要将本地的文档同步到远端就可以了。如下图所示,设计中的难点在于保持本地文档和远端文档的数据同步。假如发送到文件服务的过程中丢了数据,那么就有点尴尬了。所以不管是给各种文件操作定序,还是给文档内容设置CRC校验,都可以保证数据一致性。
那么如果加入多人协作编辑呢?
下图先将各个组件串联在一起以便与我们分析问题:
- 客户端编辑器和 WebSocket 服务器建立长连接,以便及时向 WebSocket 服务器发送文档编辑操作。
- WebSocket 服务器会处理文档编辑操作,并将它们发送到消息队列中。
- 文档操作服务器会从消息队列消耗客户端的操作事件,并使用协作算法生成转换后的操作。这个过程叫做操作转换(Operational Transformation),就是根据多人对文档的修改情况来得到最终的结果,并更新每个人的操作。
- 为了给用户更好的实时编辑体验,最近的操作会先使用缓存来存储。
- 文档最终会存储在数据库或其他文件系统中。存储的数据分为三个部分:文件元数据,文件内容和文件编辑操作。
加入多人协作后,最大的挑战之一是需要实时解决编辑冲突。解决冲突的常见的协作算法包括:
- 操作转换 (OT, Operational transformation)
- 差分同步 (DS, Differential Synchronization)
- 无冲突复制数据类型 (CRDT, Conflict-free replicated data type)
根据维基百科,Google Docs 使用的是 OT,而 CRDT 是实时并发编辑的一个活跃研究领域。
OT的基本思想和Git类似。服务器知道每个用户的修改是基于哪一个版本的,会尝试把各人的操作合并。
如果你对这些算法感兴趣,可以在后台告诉我。
【关注公众号ByteByteGo获取高清图】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。