YouTube 系统设计(第一部分)

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

这类问题之所以常见,部分原因是其范围通常足够广泛,涵盖了多个需要讨论的领域。此外,如果候选人平时保持好奇心,他们更有可能主动探索现有产品的设计方式。

因此,本周我们将讨论如何设计 Youtube。这是一个非常宏大的问题,因为构建 YouTube 就像从头开始建造摩天大楼,需要考虑的因素太多。因此,我们将从面试的角度介绍大多数“主要”组件,包括数据库模型、视频/图像存储、可扩展性、推荐系统、安全性等。

总览

面对这个问题,大多数人往往会感到茫然,因为问题过于广泛,不知从何下手。即便是存储本身也不简单,因为向数十亿用户无缝提供视频和图像是一项极其复杂的任务。

正如 在进行系统设计面试之前需要了解的 8 件事 中所建议的那样,最好先深入了解整体设计,然后再深入研究所有细节。尤其是对于此类问题,需要考虑的事情太多,而你永远无法在面试中澄清所有问题。

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

  • 存储:如何设计数据库架构?使用什么数据库?视频和图像可以作为一个子主题,因为它们非常特殊。
  • 可扩展性:当拥有数百万甚至数十亿用户时,如何扩展存储和整个系统?这可能是一个非常复杂的问题,但我们至少可以讨论一些高级思路。
  • 网络服务器:最常见的结构是前端(移动端和 Web 端)与 Web 服务器通信,后者处理诸如用户身份验证、会话管理、获取和更新用户数据等逻辑。然后服务器连接到多个后端服务,例如视频存储、推荐服务器等。
  • 缓存:这是另一个重要组成部分。我们之前曾讨论过有关缓存的详细信息,但此处仍然存在一些差异,例如我们需要多层缓存,包括 Web 服务器层、视频服务层等。
  • 其他组件:还有几个重要的组件,例如推荐系统、安全系统等。如您所见,单一功能即可作为独立的面试问题。

存储和数据模型

如果您使用的是 MySQL 之类的 关系数据库,设计数据模式可能相对简单。实际上,YouTube 从一开始就确实使用 MySQL 作为其主要数据库,并且运行良好。

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

第二个主要模型是视频。视频包含许多信息,包括元数据(标题、描述、大小等)、视频文件、评论、观看次数、点赞数等。显然,基本视频信息应保存在单独的表中,以便我们首先可以有一个视频表。

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

视频和图像存储

建议将大型静态文件(例如视频和图像)分开存储,因为它具有更好的性能并且更易于组织和扩展。与投放的视频相比,YouTube 具有更多的图像。想象一下,每个视频在不同的屏幕上都有不同大小的缩略图,结果图像数量比视频多 4 倍。因此,我们永远不应忽略图像存储。

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

使用 CDN 的最大好处是 CDN 可以在多个位置复制内容,从而可以更好地使内容更靠近用户,减少跳数,并且内容可以在更友好的网络上运行。此外,CDN 还解决了可扩展性等问题,您只需要为服务付费。

热门视频与长尾视频

如果您认为 CDN 是最终的解决方案,那么您完全错了。鉴于 YouTube 拥有今天的视频数量(819,417,600 小时的视频),将所有视频都托管在 CDN 上将是非常昂贵的,尤其是大多数视频都是长尾的,每天只有 1-20 次观看。

但是,有关 Internet 的最有趣的事情之一通常是,那些长尾的内容吸引了大多数用户。原因很简单——随处可见那些受欢迎的内容,只有长尾的东西才使该产品与众不同。

回到存储问题。一种简单的方法是将热门视频托管在 CDN 中,将不受欢迎的视频按位置存储在我们自己的服务器中。这有两个优点:

  • CDN 擅长在不同地点服务大量观众观看热门视频。它可以在多个位置复制内容,以便更有可能通过紧密友好的网络提供视频。
  • 长尾视频通常由特定人群使用,如果您可以提前预测,则可以有效地存储这些内容。

总结

对于“如何设计 YouTube"这个问题,我们想讨论的话题太多了。在我们的下一篇文章中,我们将详细讨论可扩展性、缓存、服务器、安全性等。

说明:本文主要基于系统设计面试的通用思路整理,文中提及的数据统计链接及部分架构策略可能随技术发展有所更新,仅供参考学习使用。