YouTube的高层次设计是一种分布式、大规模架构设计,支持数十亿用户,数百万视频上传,以及每天数亿次搜索。YouTube应对了规模挑战、实时视频流传输、数据处理和分布式搜索。
核心高层组件
- 内容分发网络(CDN)
-
为什么: YouTube 使用 CDN 来 减少延迟时间 并 提高性能,通过将视频内容缓存在更接近用户的节点。位于东京的用户应理想地从日本的 CDN 节点流视频,而不是等待来自美国数据中心的数据。
-
如何工作: CDN 节点(边缘服务器)根据用户位置和需求缓存视频。YouTube 使用 Google CDN,它是 Google 云平台 (GCP) 的一部分。其他商用 CDN,如 Akamai 和 Cloudflare 也是选择,但它们不会提供像 Google 自有基础设施那样深度集成的水平。
-
为什么不选择其他替代品: 由于其规模,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,因为 GCS 可与其其它基础设施(网络、CDN 和处理)无缝集成。GCS 提供更好的可扩展性和管理。
-
元数据存储: 元数据(视频标题、描述、标签)存储在 Bigtable,一种 Google 开发的 NoSQL 数据库。
-
为什么是 Bigtable? 它针对 低延迟、高吞吐量 操作进行了优化,这对于快速读写视频元数据至关重要。在 YouTube 的大规模(PB 级元数据)下,关系型数据库难以处理如此大的数据量,而 NoSQL 更合适。
-
为什么不选择其他 NoSQL 数据库? 其他选择如 Cassandra 或 DynamoDB 可以使用,但 Bigtable 与 Google 生态系统紧密集成,提供更优越的性能,可以为内部服务提供更优越的性能。
- 内容搜索服务
-
为什么: 用户需要高效地搜索数百万个视频,因此 YouTube 需要能够进行 全文搜索 并根据相关性、受欢迎程度和个人化对结果进行排名的搜索引擎。
-
如何工作: YouTube 依赖于 Elasticsearch 提供其搜索服务。
-
Elasticsearch 用于索引视频元数据(标题、描述、标签)。它是分布式的,支持多节点集群,并且设计用于处理实时的大规模搜索操作。
-
为什么不选择其他替代品: 存在像 Solr 这样的选择,但 Elasticsearch 因其 易于扩展性、对分布式架构的更好支持和强大的查询能力而被选择。它还与其他 GCP 生态系统部分的集成良好。
- 推荐系统
-
为什么: 推荐系统是 YouTube 的秘密武器,为用户提供个性化的视频建议,以保持用户参与度。
-
如何工作:
-
它使用 机器学习模型(如协同过滤、深度学习和矩阵分解技术),基于用户数据:观看历史、喜欢的内容、搜索行为和人口统计信息来训练。
-
使用 Apache Spark 和 Flink 构建数据管道,并使用在生产中运行的 TensorFlow 模型提供实时推荐。
-
为什么不选择其他替代品: 选择 TensorFlow(Google 自有的 ML 框架)而不是像 PyTorch 这样的其他框架,是有战略意义的。TensorFlow 与 GCP 基础设施的深度集成使它成为可扩展 ML 工作负载的理想选择。
- API 网关
-
为什么: YouTube 需要向客户端(网站、移动应用、第三方集成)提供一组定义明确的 API。这些 API 需要将请求路由到适当的微服务(视频、搜索、推荐等)。
-
如何工作: Google API 网关 处理路由、认证和限流。它将客户端连接到后端服务,同时确保系统保持 模块化 和 可扩展。
- 为什么不选择其他替代品: Google API 网关是这里的显而易见的选择,因为它具备内置的 GCP 服务集成、更好的可扩展性和更简单的安全管理。
(……)
🖼 核心组件的HLD示意图
以下是一份更详细的YouTube高级设计图示。
[Web和移动客户端] --> [API网关(API Gateway)] --> [负载均衡器(Load Balancer)]
| |
[搜索服务] [用户服务] [视频上传和转码]
| |
[推荐服务] [CDN]
| |
[用于存储元数据的Bigtable] [用于存储视频的Google Cloud Storage]
全屏模式,退出全屏
YouTube低层设计(LLD):核心服务深入解析
现在,我们将更深入地了解每个支撑 YouTube 的核心服务,它们面临的挑战,以及背后的设计理念。
1. 视频上传流程及处理
视频上传过程包括多个阶段,从上传到处理和服务。具体流程如下:
上传步骤:
- 客户端 分段(多部分)上传视频到 YouTube 的 上传服务。
- 上传服务端 将原始分段暂时存储在 Google Cloud Storage 中。
- 当所有分段上传完成后,会向一个 Kafka 消息队列发送一条消息,触发视频处理流程。
视频转码处理
- 转码流程 将上传的原始视频转换为多种分辨率。这是为了根据不同的网速和设备提供视频,至关重要。
- 视频转码任务能并行处理多个任务。这些任务是无状态的,并且可以水平扩展。
- 转码后,处理过的视频会被存储在 Google Cloud Storage 中,相关的视频 ID 则存储在 Bigtable 中。
这个流程的好处:
- 容错能力: 如果任一视频片段上传或转码失败,系统可以重试而无需重新处理整个视频。
- 并行性: 视频转码在多台机器上并行进行,提升了吞吐量。
- 可扩展性: Google Cloud Storage 本质上支持可扩展性,并能处理 YouTube 的 PB 级存储需求。
2. 视频流媒体架构
流式:
- 客户端请求: 用户点击视频请求播放该视频。
- 负载均衡: 请求被发送到负载均衡,它确定处理该请求的最佳后端节点。
- 内容分发: CDN(谷歌CDN)负责将实际的视频流传输给用户。离用户最近的边缘服务器提供视频。
- 自适应比特率流: YouTube 使用MPEG-DASH或HLS进行流传输。这些协议支持自适应比特率流,会根据您的网络状况实时调整视频清晰度。
为什么不考虑其他选择
- MPEG-DASH 和 HLS 是高质量视频流媒体的标准协议之一。它们支持在不同视频分辨率之间无缝切换,从而减少缓冲,提供流畅的观看体验。
3. 搜索体系
搜索过程:
- 客户端发送一个搜索请求给搜索服务,通过API网关。
- Elasticsearch: 查询在包含数百万视频元数据的Elasticsearch索引中执行。
- 排名与相关性: 搜索结果根据视频的相关性、受欢迎程度和个人化数据(例如,观看历史和订阅)进行排序。
Elasticsearch 设计
- 索引分片到多个Elasticsearch节点上,实现了水平扩展性。
- 复制分片以确保高可用性。
为什么用 Elasticsearch 而不用 Solr:
- 可扩展性和分布式搜索 在 Elasticsearch 中支持更好。
-
Elasticsearch 还与其他 Google 服务(例如实时监控工具 Kibana)有更好的集成性。
-
- *
如果 YouTube 使用最新技术来升级系统,可以做如下改进:
1. 基于服务网格的微服务
- YouTube 可以利用 Istio 或 Linkerd 来实现 服务网格。这将有助于更好地管理微服务间的通信,同时提升安全性,并比传统的 RPC 机制更加有效监控服务性能。
2. GraphQL 用于 API
- YouTube 可以用 GraphQL 替代 REST API,实现更灵活高效的数据获取。这将让移动端和网页端用户只获取他们需要的数据,从而减少不必要的数据获取。
3. 实时推荐和Kafka Streams
- YouTube的推荐引擎可以演进为使用Kafka Streams进行用户行为(如点赞、观看行为等)的实时分析,从而提供更加动态和个性化的推荐。
4. 云原生架构
-
Kubernetes 在 YouTube 架构的多个部分中已经使用,但更深入的集成可以更好地管理和自动扩展容器化微服务,并实现自我修复功能。
-
- *
我们探讨了 YouTube 的 高层和底层设计,了解了每个组件的技术决策,比如为什么使用 Google Cloud Storage 和 Bigtable 等技术来实现可扩展性,Elasticsearch 在视频搜索中的作用,以及 FFmpeg 为何被用作 YouTube 的主要转码工具。我们还讨论了使用 服务网格、GraphQL 和 实时流传输 等现代技术来改进 YouTube 架构的潜在改进。
YouTube的架构是一个很好的例子,展示了如何通过恰当的工具和基础设施来应对规模性、延迟性和可用性方面的挑战。
共同学习,写下你的评论
评论加载中...
作者其他优质文章