YouTube系统设计(第二部分)
本文是 YouTube 系统设计系列的第二篇文章。我们将承接 第一部分 的内容继续讨论,如果您尚未阅读,建议先查阅前文。
在 上一篇文章 中,我们主要探讨了数据库和存储方案。本周,我们将深入讨论更多主题,包括可扩展性(Scalability)、Web 服务器、缓存策略以及安全性。
数据库扩展
一旦产品拥有数百万甚至数十亿的用户,就需要解决许多架构问题,其中可扩展性是最关键的挑战之一。基本上,将所有数据存储到单个数据库中不仅效率低下,而且在规模扩大后不可行。那么,您将如何扩展 YouTube 的数据库?
扩展数据库时,我们可以遵循许多通用规则。最常见的方法是按需扩展。换句话说,不建议在项目第一天就完成所有工作(例如对数据库进行分区),因为几乎可以肯定的是,当您真正需要扩展时,整个基础设施和产品形态已经发生了巨大的变化。
因此,合理的思路是从单个服务器开始。随后,您可以过渡到具有多个读取副本的单个主节点架构(主从模型))。在某个阶段,您将必须对数据库进行分区并采用分片(Sharding)方法。例如,您可以按用户的位置拆分数据库,当请求到来时,将请求路由到相应的数据库分片。
对于 YouTube,我们可以进一步优化这一策略。YouTube 的核心功能是视频。因此,我们可以通过将数据分为两个集群来优先处理流量:视频集群和常规集群。我们可以为视频集群提供大量资源,而其他社交网络功能则路由到资源配置较低的集群。这里的一个普遍理念是:在解决可扩展性问题时,应首先确定瓶颈,然后对其进行优化。在这种情况下,瓶颈在于视频观看流量。
缓存策略
我不会在此主题上过多谈论缓存,因为我们在上一篇文章"设计缓存系统"中已对此进行了详细介绍。但这里有几点值得一提。
首先,谈到缓存时,大多数人的反应是关于服务器端缓存。实际上,前端缓存同样重要。如果要使网站快速运行并具有低延迟,则无法避免为前端设置缓存。这是在构建网站界面时非常常见的技术。
其次,正如我们在上一篇文章中简要讨论的那样,缓存在提供视频内容方面不会带来显著好处。这主要是因为 YouTube 的大多数流量来自那些长尾视频(Long-tail Videos),为所有视频设置缓存将非常昂贵。因此,这里的总体思路是:如果您要构建类似的长尾产品,请不要在缓存上投入过多的赌注。
安全性与反作弊
YouTube 中有很多可以讨论的安全性话题。我想在这里介绍一个有趣的话题——视图造假(View Hacking)。在每个 YouTube 视频下,它都会显示观看次数,这表示视频的受欢迎程度。人们可以通过编程方式发送请求以伪造观看计数,那么我们应该如何保护它呢?
最直接的方法是,如果特定 IP 发出太多请求,则将其阻止。或者,我们甚至可以限制每个 IP 的观看次数贡献。该系统还可以检查诸如浏览器代理(User Agent)和用户过去的历史记录之类的信息,这可能会阻止很多作弊攻击。
人们可能会使用 Tor 之类的) 服务来隐藏 IP,而 Mechanical Turk 之类的 网站则允许您以非常低的成本向人们付费以单击视频。但是,黑客入侵系统比大多数人想象的要难。
例如,观看次数高但参与度低的视频非常可疑。YouTube 拥有大量视频,因此提取实际观看次数的模式并不难。为了破解系统,您需要提供合理的参与度指标,例如分享数、评论数、观看时长等。几乎不可能伪造所有这些指标而不被检测到。
Web 服务器架构
许多人忽略了 Web 服务器,因为就系统设计而言,它似乎没有太多要讨论的内容。但是,对于大型系统(如 YouTube),您需要考虑很多事情。我想分享一些 YouTube 使用的技术策略。
- YouTube 服务器最初是用 Python 构建的,因此可以快速灵活地进行开发和部署。您可能会注意到,许多初创公司选择 Python 作为其服务器语言,因为迭代速度更快。
- Python 有时会遇到性能问题,但是有许多 C 扩展允许您优化关键部分,这正是 YouTube 早期的工作方式。
- 要扩展 Web 服务器,您可以简单地拥有多个副本并在它们之上构建负载均衡器(Load Balancer)。
- 服务器主要负责处理用户请求和返回响应。它应该没有什么繁琐的逻辑,其他所有东西都应该内置到单独的服务器中。例如,建议系统应该是一个单独的组件,以允许 Python 服务器从中获取数据。
总结
在本文中,我们尝试涵盖尽可能多的不同主题,并且可以在单独的文章中对每个主题进行更深入的讨论。将来我仍然想谈论很多事情,但是读者可以考虑一下并在评论中进行讨论。
例如,YouTube 推荐是一个很大的话题,它极大地推动了用户参与度指标。您将如何建立推荐系统?此外,您如何确定当天的热门视频并向相关受众推荐?
说明:本文基于早期 YouTube 架构案例整理,部分技术栈描述(如 Python 主导)反映的是历史演进阶段,现代大规模系统可能已采用更多元的技术组合(如 C++、Go 等),仅供参考设计思路。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/youtube-xi-tong-she-ji--di-er-bu-fen.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。