设计 Youtube(第一部分)

原文:How to Design Youtube (Part I)

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

系统设计面试问题最常见的类型之一,是设计一个现有的流行系统。 例如,过去我们已经讨论过如何设计 Twitter,设计 Facebook 聊天功能等等。

部分原因是这个问题通常足够普遍,所以有很多领域需要讨论。 另外,如果候选人一般有好奇心,他们更有可能去探索现有产品的设计。

所以这个星期,我们将讨论如何设计 Youtube。 这是一个广泛的问题,因为构建 Youtube 就像是从头构建一座摩天大楼,有太多东西需要考虑。 因此,我们将从面试官的角度,涵盖大部分“主要”组件,包括数据库模型,视频/图像存储,可扩展性,推荐性,安全性等。

概述

面对这个问题,大多数人的脑子都是空的,因为这个问题太广泛了,他们不知道从哪里开始。仅仅是存储本身并不重要,因为无缝地向数亿用户提供视频/图像是非常复杂的。

《系统设计面试之前需要知道的八件事》中建议,最好先从设计的概要描述入手,然后再深入探讨所有细节。对于这样的问题,尤其如此,有无数的事情要考虑,你永远无法澄清一切。

基本上,我们可以将系统简化为几个主要组件,如下所示:

  • 存储。你如何设计数据库纲要?使用什么数据库?视频和图像可以是一个子话题,因为它们的存储非常特殊。
  • 可扩展性。当你有了数百万甚至数十亿用户时,你如何扩展存储和整个系统?这可能是一个非常复杂的问题,但我们至少可以讨论一些概要思想。
  • 网络服务器。最常见的结构是前端(移动和网页)与 Web 服务器通信,Web 服务器处理用户认证,会话,获取和更新用户数据等逻辑。然后服务器连接到多个后端,如视频存储,推荐服务器等等。
  • 缓存是另一个重要组件。我们之前已经详细讨论过缓存,但是这里还是有一些区别。我们需要多层缓存,像 Web 服务器,视频服务器等。
  • 还有推荐系统,安全系统等其他重要组件。正如你所看到的,每个功能都可以作为一个独立的面试问题。

存储和数据模型

如果你正在使用像 MySQL 这样的关系数据库,那么设计数据模型可能很简单。实际上,Youtube 从一开始就使用 MySQL 作为主数据库,并且工作得很好。

首先,我们需要定义用户模型,它可以存储在一个表中,包括电子邮件,名称,注册数据,配置文件信息等等。另一种常见的方法是将用户数据保存在两个表中 - 一个用于与电子邮件,密码,姓名,注册日期等身份验证相关的信息,另一个用于附加的个人信息,如地址,年龄等。

第二个主要模型是视频。一个视频包含了大量的信息,包括元数据(标题,描述,大小等),视频文件,评论,查看次数,计数等等。显然,基本的视频信息应该保存在不同的表格中,这样我们才能有视频表。

作者与视频的关系将是另一张表,将用户 ID 映射到视频 ID。用户与视频的喜欢关系也可以是一个单独的表格。这里的想法是数据库规范化 - 组织列和表来减少数据冗余并提高数据完整性。

视频和图像存储

建议将大型静态文件(如视频和图像)分开存储,因为这样性能更好,并且更容易组织和扩展。 Youtube 有更多的图像而不是视频,这是非常不直观的。想象一下,每个视频在不同屏幕上都有不同大小的缩略图,其结果是比视频多出四倍的图片。所以我们不应该忽视图像存储。

最常用的方法之一是使用 CDN(内容交付网络)。简而言之,CDN 是在多个数据中心部署的全球分布式代理服务器网络。 CDN 的目标是向最终用户提供高可用性和高性能的内容。这是一种第三方网络,许多公司正在 CDN 上存储静态文件。

使用 CDN 的最大好处是,CDN 可以在多个地方复制内容,因此内容离用户更近,跳数更少,内容将通过更友好的网络运行。另外,CDN 负责处理可扩展性等问题,你只需要为服务付费。

流行 VS 长尾视频

如果你认为 CDN 是最终的解决方案,那么你是完全错误的。考虑到今天 YouTube 的视频数量(819,417,600 小时的视频),将它们全部放在 CDN 上将是非常昂贵的,特别是大多数视频是长尾的,这些视频每天只有 1-20 次观看。

然而,互联网最有趣的事情之一通常是那些吸引了大多数用户的长尾内容。原因很简单 - 那些流行的内容随处可见,只有长尾的东西才能使产品变得特别。

回到存储问题。一个简单的方法是,在 CDN 中托管流行的视频,而不太流行的视频则按照位置存储在我们自己的服务器中。这有两个好处:

  • 流行的视频由不同地点的大量观众观看,这是 CDN 擅长的。它在多个地方复制内容,以便更可能从接近和友好的网络提供视频。
  • 长尾视频通常由特定的人群消费,如果可以预先预测,则可以高效地存储这些内容。

总结

对于“如何设计 Youtube”这个问题,我们想讨论的话题太多了。 在下一篇文章中,我们将更多讨论可伸缩性,缓存,服务器,安全性等等。

顺便提一下,如果你想得到资深的面试官的更多指导,可以查看 Gainlo,以便与 Google,Facebook 等公司的工程师进行模拟面试。