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

YouTube系统设计(第二部分)

这是有关如何设计Youtube的第二篇文章。我们将从第一个开始继续我们的讨论, 如果您还没有阅读,请检查一下。

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

扩展数据库

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

扩展数据库时,我们可以遵循许多通用规则。最常见的方法是仅在需要时进行缩放。换句话说,不建议您在第一天就完成所有工作,例如对数据库进行分区,因为几乎可以肯定的是,在您确实需要扩展的那一点上,整个基础架构和产品已经发生了巨大的变化。

因此,想法是从单个服务器开始。稍后,您可以转到具有多个读取从属设备的单个主设备(主设备/从设备模型)。并且在某个时候,您将必须对数据库进行分区并采用分片方法。例如,您可以按用户的位置拆分数据库,当请求到来时,您会将请求路由到相应的数据库。

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

快取

我不会在此主题上谈论太多缓存,因为我们在上一篇文章“ 设计缓存系统”中已对此进行了详细介绍。但是这里有几点值得一提。

首先,在谈到缓存时,大多数人的反应是关于服务器缓存。实际上,前端缓存同样重要。如果要使您的网站快速运行并具有低延迟,则无法避免为前端设置缓存。建立网站界面时,这是非常常见的技术。

其次,正如我们在上一篇文章中简要讨论的那样,缓存在提供视频方面不会有很多好处。这主要是因为Youtube的大多数使用来自那些长尾视频,并且为所有视频设置缓存将非常昂贵。因此,这里的总体思路是,如果您要构建像这样的长尾产品,请不要在缓存上投入过多的赌注。

安全

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

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

人们可能会使用Tor之类的服务来隐藏IP,而Mechanical Turk之类的网站则允许您以非常低的成本向人们付费以单击视频。但是,黑客入侵系统比大多数人想象的要难。

例如,观看次数高但参与度低的视频非常可疑。Youtube拥有大量视频,因此提取实际观看次数的模式并不难。为了破解系统,您需要提供合理的参与度指标,例如共享数,评论数,查看时间等。几乎不可能伪造所有这些。

网络服务器

许多人忽略了Web服务器,因为就系统设计而言,它没有太多要讨论的内容。但是,对于大型系统(如Youtube),您需要考虑很多事情。我想分享一些Youtube使用的技术。

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

摘要

在本文中,我们尝试涵盖尽可能多的不同主题,并且可以在单独的文章中对每个主题进行更深入的讨论。将来我仍然想谈论很多事情,但是读者可以考虑一下并在评论中进行讨论。

例如,Youtube推荐是一个很大的话题,它极大地推动了用户参与度指标。您将如何建立推荐系统?此外,您如何确定当天的热门视频并向相关受众推荐?


评论