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

YouTube系统设计(第一部分)

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

部分原因是该问题通常足够笼统,因此有很多领域需要讨论。此外,如果候选人通常好奇,他们更有可能探索现有产品的设计方式。

因此,本周,我们将讨论如何设计Youtube。这是一个广泛的问题,因为建造Youtube就像从头开始建造摩天大楼,并且有太多事情要考虑。因此,我们将从采访者的角度介绍大多数“主要”组件,包括数据库模型,视频/图像存储,可伸缩性,推荐,安全性等。

总览

面对这个问题,大多数人的想法变得茫然,因为这个问题太广泛了,他们不知道从哪里开始。只是存储本身并不简单,因为向数十亿用户无缝提供视频/图像非常复杂。

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

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

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

存储和数据模型

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

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

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

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

视频和图像存储

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

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

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

热门VS长尾视频

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

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

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

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

摘要

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


评论