设计 Youtube(第二部分)

原文:How to Design Youtube (Part II)

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

这是如何设计 YouTube 的第二篇文章。 我们将继续我们的讨论,如果你还没有阅读第一篇,请查看一下。

在上一篇文章中,我们主要讨论了数据库和存储。 本周,我们将讨论更多主题,包括可扩展性,Web 服务器,缓存和安全性。

扩展数据库

一旦产品拥有数百万甚至数十亿用户,就有很多问题需要解决。 可扩展性是要解决的最重要的问题之一。 基本上,将所有数据存储到单个数据库不仅效率低下,而且不可行。 那么如何扩展 Youtube 的数据库呢?

扩展数据库时,我们可以遵循很多一般规则。 最常用的方法是按需扩展。 换句话说,不建议第一天就进行数据库的分区工作,因为几乎可以肯定的是,在真正需要扩展的时候,整个基础架构和产品都发生了巨大的变化。

所以这个想法起始于一台服务器。稍后,你可以演化为一个主机和多个读取从机(主/从模型)。而且在某些时候,你将不得不对数据库进行分区,并采用分片的方法。例如,你可以按用户的位置拆分数据库,并在请求到达时,将请求路由到相应的数据库。

对于 Youtube,我们可以进一步优化它。 YouTube 的最重要的特点是视频。因此,我们可以通过将数据分成两个集群来优先化流量:视频集群和通用集群。我们可以为视频群集提供大量资源,其他社交网络功能将被路由到功能较弱的群集。这里更一般的想法是,在解决可扩展性问题时,应该首先确定瓶颈,然后优化它。在这种情况下,瓶颈就是观看视频。

缓存

缓存这个主题我不会多谈,因为我们在之前的文章《设计缓存系统》中已经详细介绍了。但是有几点值得在这里提及。

首先,在谈到缓存时,大多数人的反应是服务器缓存。实际上,前端缓存同样重要。如果你想让你的网站更快,并且延迟较低,你不能避免为前端设置缓存。构建网站界面时,这是一种非常常见的技术。

其次,正如我们在上一篇文章中简要讨论的那样,缓存在服务视频方面并没有太多的好处。这主要是因为 Youtube 的大部分用例来自这些长尾视频,并且为所有视频设置缓存开销很大。所以这里的一般想法是,如果你正在构建这样的长尾产品,不要在缓存上下注太多。

安全

在 Youtube 上有很多可以讨论安全的事情。我想在这里介绍一个有趣的话题 - 观看的黑客行为。在每个 Youtube 视频下,它显示查看计数,这表明视频是多么受欢迎。人们用可以编程方式发送请求来破解观看次数,那么我们应该如何保护它呢?

最直接的方法是,如果一个特定的 IP 发出太多的请求,只是阻止它。或者我们甚至可以限制每个 IP 的观看次数。系统还可以检查浏览器代理和用户过去的历史记录等信息,这可能会阻止很多黑客行为。

人们可以使用像 Tor 这样的服务隐藏 IP,像 Mechanical Turk 这样的网站可以让用户以很低的成本点击视频。但是,对系统进行黑客攻击比大多数人想象的要困难得多。

例如,观看次数较多但参与程度较低的视频非常可疑。有了大量的 Youtube 视频,提取真实的观看数量的模式并不困难。为了破解系统,你需要提供合理的参与程度,比如分享次数,评论次数,观看时间等等,而且几乎不可能伪造所有这些。

Web 服务器

很多人忽略了Web服务器,因为在系统设计方面,它没有太多讨论的东西。但是对于像 Youtube 这样的大型系统,还有很多事情需要考虑。我想分享一些 Youtube 所使用的技术。

  • Youtube 服务器最初是用 Python 构建的,这允许快速灵活的开发和部署。你可能会注意到许多初创公司选择 Python 作为他们的服务器语言,因为迭代速度要快得多。
  • Python 有时会遇到性能问题,但是有很多 C 的扩展可以让你优化关键部分,这正是 Youtube 的工作原理。
  • 要扩展 Web 服务器,你可以简单地拥有多个副本,并在其之上构建一个负载平衡器。
  • 服务器主要负责处理用户请求并返回响应。它应该有几个重要的逻辑,其它东西都应该在不同的服务器上构建。例如,建议应该是一个独立的组件,让 Python 服务器从中获取数据。

总结

在这篇文章中,我们试图涵盖尽可能多的不同主题,每个主题都可以在单独的文章中深入讨论。以后还有很多事情要谈,但读者可以考虑一下,并在评论中讨论。

例如,YouTube 的推荐是一个非常大的话题,它极大改善了用户参与程度。你将如何构建推荐系统?另外,你如何识别当天的热门视频并向相关观众推荐?

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