YouTube 的系统设计:深入探究这家视频巨头
🏗 YouTube 的高层设计(HLD)
YouTube 的高层设计是一个分布式、大规模的架构,支持数十亿用户、数百万个视频上传和每天数亿次搜索。YouTube 面临着规模化、实时视频流、数据处理和分布式搜索等挑战。
核心高级组件
- 内容分发网络 (CDN)
- 原因: YouTube 使用 CDN 来降低延迟,并通过将视频内容缓存在更靠近用户的位置来提升性能。理想情况下,东京的用户应该从日本的 CDN 节点流式传输视频,而不是等待来自美国数据中心的数据。
- 工作原理: CDN 节点(边缘服务器)根据用户的接近度和需求缓存视频。YouTube使用 Google 的 CDN,它是 Google Cloud Platform (GCP) 的一部分。其他商业 CDN,例如Akamai和Cloudflare,是替代方案,但无法提供与 Google 自有基础设施同等水平的深度集成。
- 替代方案:对于谷歌(YouTube 的所有者)来说,构建专有 CDN 网络是合理的,因为它规模庞大,而且可以实现更经济高效的管理。虽然可以使用商业 CDN,但 YouTube 的规模成本高昂且效率低下,使其不切实际。
- 视频上传和处理服务
- 原因:用户上传的视频需要存储、处理并转码为各种格式(240p、480p、720p、1080p、4K),以适应不同的用户带宽。
- 工作原理:
- 上传:用户使用Google Cloud Storage API分块上传视频数据(多部分上传)。这可以避免大文件上传超时,并允许在失败后恢复上传。
- 转码: YouTube 内部使用FFmpeg(一种广泛使用的多媒体处理框架)将视频转码为多种分辨率。每个上传的视频都会转换为标准化格式,以便在不同设备上高效播放。
- 为什么不选择替代方案: FFmpeg被广泛用于视频处理,因为它几乎支持所有多媒体格式,而且效率很高。虽然存在像GStreamer这样的替代方案,但它们缺乏 FFmpeg 的稳定性和大规模功能。
- 存储(视频和元数据存储)
- 视频存储: YouTube使用Google Cloud Storage (GCS)将视频数据存储在分布式对象存储系统中。GCS 提供持久性、高可用性和成本效益,并支持多区域存储。
- 为什么不选择替代方案: YouTube 可以使用其他分布式文件系统,例如Amazon S3或Azure Blob Storage,但选择 GCS 是因为它可以与其其他基础设施(网络、CDN 和处理)无缝集成。GCS 在 YouTube 的规模下提供了更好的可扩展性和管理性。
- 元数据存储:元数据(视频标题、描述、标签)存储在Google 开发的 NoSQL 数据库 Bigtable中。
- 为什么选择 Bigtable?因为它针对低延迟、高吞吐量操作进行了优化,这对于快速读写视频元数据至关重要。对于 YouTube 的规模(PB 级元数据),关系型数据库难以处理如此庞大的数据量,NoSQL 则更适合。
- 为什么不选择其他 NoSQL 数据库?理论上可以使用Cassandra或DynamoDB等替代方案,但 Bigtable 与 Google 生态系统紧密集成,可为内部服务提供卓越的性能。
- 内容搜索服务
- 原因:用户需要高效地搜索数百万个视频,因此 YouTube 需要一个能够进行全文搜索并根据相关性、受欢迎程度和个性化对结果进行排名的搜索引擎。
- 工作原理: YouTube 依靠Elasticsearch提供搜索服务。
- Elasticsearch 用于索引视频元数据(标题、描述、标签)。它是分布式的,支持多节点集群,旨在处理实时、大规模的搜索操作。
- 为什么不选择替代方案:虽然存在像Solr这样的替代方案,但 Elasticsearch 之所以被选中,是因为它易于扩展、更好地支持分布式架构以及强大的查询功能。此外,它还能与 GCP 生态系统的其他部分很好地集成。
- 推荐系统
- 原因:推荐系统是 YouTube 的秘密武器,它提供个性化的视频建议以保持用户的参与度。
- 工作原理:
- 它使用基于用户数据(观看历史、喜欢、搜索行为和人口统计数据)训练的机器学习模型(如协同过滤、深度学习和矩阵分解技术)。
- 数据管道使用Apache Spark和Flink构建,TensorFlow模型在生产中运行以提供实时建议。
- 为什么不选择替代方案:选择 TensorFlow(谷歌自己的机器学习框架)而不是PyTorch之类的框架是出于战略考虑。TensorFlow 与 GCP 基础架构的深度集成使其成为可扩展机器学习工作负载的理想选择。
- API 网关
- 原因: YouTube 需要向客户端(网页、移动应用、第三方集成)公开一组定义明确的 API。这些 API 需要将请求路由到相应的微服务(视频、搜索、推荐等)。
- 工作原理: Google 的 API 网关负责处理路由、身份验证和速率限制。它将客户端连接到后端服务,同时确保系统保持模块化和可扩展性。
- 为什么不选择替代方案: Google 的 API 网关是显而易见的选择,因为它提供了与 GCP 服务的内置集成、更好的可扩展性和更轻松的安全管理。
🖼 包含核心组件的 HLD 图
以下是 YouTube 更详细的高级设计图:
[Clients (Web, Mobile)] --> [API Gateway] --> [Load Balancer]
| |
[Search Service] [User Service] [Video Upload/Transcoding]
| |
[Recommendation Service] [CDN]
| |
[Bigtable for Metadata] [Google Cloud Storage for Video]
🛠 YouTube 的低级设计(LLD):深入探究核心服务
现在,我们将深入研究 YouTube 的每个核心服务、它们所面临的挑战以及背后的设计决策。
1.视频上传流程及处理
视频上传流程涉及多个阶段,从上传到处理再到投放。具体流程如下:
上传流程:
- 客户端将视频分块(多部分)上传到 YouTube 的上传服务。
- 上传服务将原始块临时存储在Google Cloud Storage中。
- 一旦所有块上传完毕,就会向Kafka消息队列发送一条消息,从而触发视频处理。
视频处理(转码):
- 转码管道接收上传的原始视频,并将其转换为多种分辨率。这对于根据不同的网速和设备交付视频至关重要。
- 视频转码工作器并行处理多个任务。这些工作器无状态且可水平扩展。
- 转码后,处理后的视频存储在Google Cloud Storage中,并引用存储在Bigtable中的视频 ID 。
此流程的优点:
- 容错:如果任何视频块上传或转码失败,系统可以重试,而无需重新处理整个视频。
- 并行性:视频转码在多台机器上并行进行,提高了吞吐量。
- 可扩展性: Google Cloud Storage 本质上具有可扩展性,能够处理 YouTube 的 PB 级存储需求。
2.视频流架构
流式传输:
- 客户端请求:用户点击视频请求播放视频。
- 负载均衡器:请求被发送到负载均衡器,负载均衡器确定最佳的后端节点来处理该请求。
- 内容分发: CDN (Google 的边缘网络)负责将实际的视频流分发给用户。最靠近用户的边缘服务器负责提供视频。
- 自适应比特率流媒体: YouTube 使用MPEG-DASH或HLS进行流媒体传输。这些协议支持自适应比特率流媒体传输,可根据用户的网络状况实时调整视频质量。
为什么不选择其他方案:
- MPEG-DASH和HLS是高质量视频流的标准协议。它们允许在不同视频分辨率之间无缝切换,从而最大限度地减少缓冲。
3.搜索架构
搜索流程:
- 客户端请求:通过 API 网关向搜索服务发送搜索请求。
- Elasticsearch:针对Elasticsearch 索引执行查询,该索引包含数百万个视频的元数据。
- 排名和相关性:搜索结果根据视频相关性、受欢迎程度和个性化数据(观看历史、订阅)等因素进行排名。
Elasticsearch 设计:
- 该索引分布在多个 Elasticsearch 节点上,从而实现水平扩展。
- 复制分片以确保高可用性。
为什么 Elasticsearch 优于 Solr:
- Elasticsearch 更好地支持可扩展性和分布式搜索。
- Elasticsearch 与其他 Google 服务(例如用于实时监控的 Kibana)集成得更好。
🔄 利用新技术实现 YouTube 架构的现代化
如果 YouTube 要使用最新技术对其系统进行现代化改造,他们可以做出以下一些改进:
1.带有服务网格的微服务
- YouTube 可以利用Istio或Linkerd来实现服务网格。这将比传统的 RPC 机制更好地管理微服务通信、提高安全性并监控服务性能。
2.用于 API 的 GraphQL
- YouTube 可以采用GraphQL来实现灵活高效的查询,而不是 REST API 。这将允许客户端(移动/网页)精确检索所需的数据,最大限度地减少过度获取或获取不足的情况。
3.使用 Kafka Streams 进行实时推荐
- YouTube 的推荐引擎可以发展到使用Kafka Streams实时处理用户事件(喜欢、观看行为等),从而带来更加动态和个性化的推荐。
4.云原生基础设施
- Kubernetes已在 YouTube 架构的许多部分中使用,但更深层次的集成可以更好地管理容器化的微服务、自动扩展和自我修复功能。
结论:深入回顾
我们探索了YouTube 的高层和底层设计,深入探讨了每个组件背后的技术选择,例如为何使用Google Cloud Storage和Bigtable来实现可扩展性,Elasticsearch如何支持视频搜索,以及为何FFmpeg是 YouTube 的首选转码工具。我们还讨论了使用服务网格、GraphQL和实时流媒体技术对 YouTube 架构进行现代化改进的潜在可能性。
YouTube 的架构是使用正确的工具和基础设施组合解决与规模、延迟和可用性相关的挑战的绝佳范例。
文章来源:https://dev.to/wittedtech-by-harshit/system-design-of-youtube-a-detailed-deep-dive-into-the-video-giant-5019