daicy
发布于 2020-05-27 / 1491 阅读
0
0

如何设计Google文档

系统设计面试可能是开放式的,需要广泛的知识。

为了为此类采访做好准备,重要的是覆盖不同的领域,而不是专注于单个主题。我们花了很多时间来选择系统设计问题进行分析,我们的主要标准是:

  • 这个问题很流行而且很经典
  • 我们关心选择的问题的多样性
  • 该分析可能对其他面试问题有所帮助

本周,我们将讨论如何设计Google文档。您会发现它与我们先前问题的分析完全不同。

问题–如何设计Google文档

我假设所有人都知道Google文档是什么,并且不会浪费时间介绍此产品。

乍看起来,这个问题看起来很笼统,确实如此。Google文档是一个具有大量功能的庞大系统。如果您花几分钟时间思考他的问题,您可能会意识到Google文档比看起来要复杂得多。

作为一名面试官,我不想将讨论范围限于该产品的特定功能。相反,我倾向于使问题更广泛和更笼统,以便我知道候选人将如何逐步解决模糊的问题。

分为组成部分

我们在以前的文章中多次强调,建议在问题很大时提供高级解决方案。抽象解决方案的一种方法是将大型系统划分为较小的组件。

显然,Google文档是一个庞大的系统,具有许多功能,包括文档存储,共享文档,格式设置,编辑等。实际上,如果不将其分解为不同的子问题,我几乎无法解决这个大问题。

如果您尚未考虑此问题,请花5-10分钟的时间自己回答,然后再检查我们的分析。另外,值得注意的是,如果您的解决方案与我们的解决方案不同,那是绝对可以的,因为这个问题是开放性的。

如何设计谷歌文档

我们可以将整个系统分为以下主要部分:

  • 文件存储。由于Google文档是Google云端硬盘的一部分,因此我也包括存储功能。该系统允许用户将文件(文档)分组到文件夹中,并支持诸如编辑/创建/删除等功能。它像操作系统一样工作。
  • 在线编辑和格式化。毫无疑问,Google文档的核心功能之一就是在线编辑。它支持Microsoft Office的几乎所有内容,甚至可能更多。
  • 合作。Google文档允许多个人同时编辑一个文档,这真是令人惊讶。当然,这是一项技术挑战。
  • 访问控制。您可以与朋友共享文档并赋予不同的权限(所有者,只读,允许评论等)。

这里忽略了一些次要的功能,例如插件,拼写检查,发布到Web等。

存储和格式化

我将这两个主题放在一起,因为实现了存储和格式设置后,就创建了一个非常基本且幼稚的Google文档版本。即使没有访问控制和协作,单个用户仍然可以使用它来编辑文档。

同样,在某种程度上,存储和格式化可以视为后端和前端。

恕我直言,Google文档(或Google云端硬盘)的存储系统非常接近操作系统。它具有文件夹,文件,所有者等概念。

因此,要构建这样的系统,基本的构建块是一个文件对象,其中包含内容,父对象,所有者和其他一些元数据,例如创建日期。父级表示文件夹关系,并且根目录的父级为空。我不会讨论如何扩展系统,因为构建分布式系统非常复杂。有很多东西需要考虑,例如一致性,复制。

对于前端格式化,一个有趣的问题是如何存储具有相应格式的文档。如果您知道Markdown,那么它绝对是最好的解决方案之一。尽管Google文档可能更复杂,但Markdown的基本思想仍然适用。

并发

如何设计谷歌文档

Google文档最酷的功能之一是多​​个人可以同时编辑一个文档。您将如何设计此功能?

老实说,这不是一个容易的问题。您不能只让每个人自己工作,然后合并每个人的副本或最后一个副本来编辑获胜者。如果您尝试了协作编辑功能,则实际上可以看到其他人在做什么,并且会得到即时反馈。

如果您使用Git进行版本控制,则此处的一些想法可能相似。首先,让我们考虑最简单的情况–只有2个人正在编辑同一文档。假设文档为“ abc”。

基本上,服务器可以为每个人保留2个相同文档的副本,并且还可以跟踪完整的修订历史记录。当A在开头添加“ x”来编辑文档时,此更改将与A看到的最后一个修订版本一起发送到服务器。假设此时B删除了最后一个字符“ c”,并将此更改发送到服务器。

由于服务器知道对哪个修订进行了更改,因此它将相应地调整更改。更具体地说,B的更改是删除第三个字符“ c”,当A在开头添加“ x”时,它将转换为删除第四个字符。

这称为操作转换。如果您从未听说过,也可以。基本思想是根据每个人的修订和其他协作者的修订来转换每个人的变异。

访问控制

Google文档使您可以邀请协作者访问具有不同权限级别的每个文档。

天真的解决方案应该不难。对于每个文件,您可以保留一个具有相应权限的协作者列表,例如只读,所有者等。当一个人想要执行特定操作时,系统将检查其权限。

通常,我想问一下扩展这种访问控制系统的挑战。

众所周知,将系统扩展到数百万个用户时,可能会有很多问题。我想在这里提及的几件事是:

  • 速度。当所有者更新文件夹的权限(例如,删除特定的查看器)时,此更新应传播到其所有子级。速度可能是一个问题。
  • 一致性。当有多个复制时,保持每个副本一致是很重要的,尤其是当多个人同时更新权限时。
  • 传播。可能有很多传播案例。除了更新文件夹的权限外,还应反映文件夹的所有子级,如果您向某人授予doc D的读取权限,那么他也可能对doc D的所有父级也具有读取权限。如果有人删除了文件D,我们可能会撤消他对文件D父母的阅读许可(也许不是,这更多是产品决定)。

摘要

再说一次,Gainlo的我们中没有一个人曾经使用过Google Docs。这篇文章并没有教您如何从头开始构建Google文档。

相反,我想通过这篇文章为您提供有关如何进行系统设计采访以及如何解决模糊问题的更多想法。

设计像Google Docs这样的复杂系统可能会令人生畏。但是,一旦将系统划分为较小的组件,它将变得更加简单。


评论