第 14 章 设计 YouTube
简介
YouTube 是一个庞大的视频流媒体平台,支持视频上传、播放以及各种互动。本章重点设计一个可扩展的视频流媒体系统,它具备以下核心特性:
- 快速上传视频
- 流畅的视频播放
- 可以切换视频清晰度
- 较低的基础设施成本
- 高可用性和可靠性
关键统计数据(2020 年)
- 20 亿月活跃用户
- 每天观看 50 亿个视频
- 37% 的移动互联网流量来自 YouTube
- 支持 80 种语言
- 2019 年 广告收入 151 亿美元
第 1 步:理解问题并确定设计范围
核心功能
- 上传视频
- 观看视频
支持的平台
- 移动应用、网页浏览器和智能电视
假设
- 日活跃用户(DAU): 500 万
- 平均视频大小: 300 MB
- 上传限制: 每个视频最大 1 GB
- 每日存储需求: 150 TB
- CDN 成本: 5 million * 5 videos * 0.3GB * $0.02 = 每天 $150,000(使用 Amazon CloudFront)
第 2 步:高层设计
组件
- 客户端: 智能手机、电脑和电视等设备。
- CDN(内容分发网络,Content Delivery Network): 存储视频并提供视频流。
- API 服务器: 处理除视频流播放之外的所有用户交互(例如上传、元数据更新)。
- 元数据数据库(Metadata Database): 存储视频元数据(例如标题、描述、大小)。
- 原始存储(Original Storage): 用于存放上传视频的 Blob 存储。
- 转码服务器(Transcoding Servers): 将视频转换为多种分辨率和格式。
- 转码后存储(Transcoded Storage): 用于存放转码后视频的 Blob 存储。
核心工作流程
1. 视频上传流程
-
并行进行的过程:
- 将视频上传到原始存储。
- 更新数据库中的视频元数据。
-
视频上传(步骤):
- [1] 视频被上传到 Blob 存储。
- [2] 转码服务器将视频转换为多种格式。
- [3] 转码完成后,并行执行以下两个步骤。
- [3a] 转码后的视频被发送到转码后存储。
- [3b] 转码完成事件进入完成队列(completion queue)排队。
- [3a.1] 视频被分发到 CDN。
- [3b.1] 完成处理器(completion handler)更新元数据并通知用户。
-
元数据上传(步骤):
- 客户端并行地发送一个更新视频元数据的请求
- 该请求包含视频元数据,包括文件名、大小、格式等。
2. 视频流播放流程
- 视频直接从 CDN 通过边缘服务器(edge server)以流的方式传输,以尽量降低延迟。
- 常见的流媒体协议有 MPEG_DASH、Apple HLS、Adobe HDS。
- 不同的流媒体协议支持不同的视频编码和播放器。
第 3 步:深入设计
视频转码(Video Transcoding)
重要性
- 原始视频会占用大量存储空间。转码可以减少存储空间。
- 确保在各种设备和浏览器上的兼容性。
- 根据网络状况调整视频清晰度。
组成部分
- 容器(Container): 封装视频、音频和元数据(例如 MP4、AVI)。
- 编解码器(Codecs): 压缩和解压缩算法(例如 H.264、VP9)。
有向无环图(Directed Acyclic Graph,DAG)模型
- 视频转码的计算开销大,而且耗时。
- DAG 模型定义了编码、缩略图生成和添加水印等任务。
-
使视频处理能够实现高度并行。
-
原始视频被拆分为视频、音频和元数据。
- 视频编码:将视频转换为支持不同的分辨率、编解码器和码率。
- 缩略图:既可以由用户上传,也可以由系统自动生成。
- 水印:覆盖在视频之上的图像,包含视频的识别信息。
视频转码架构
-
预处理器(Preprocessor): 将视频拆分为更小的分块(按 GOP 对齐)。它有 4 项职责。
- 视频拆分:视频流被拆分(或进一步拆分)为更小的、按图像组(Group of Pictures,GOP)对齐的单元。
- 它为旧客户端按 GOP 对齐来拆分视频。
- 它根据客户端程序员编写的配置文件生成 DAG。
- 它将 GOP 和元数据存储在临时存储中,这样一旦编码失败,系统就可以使用这些持久化的数据进行重试操作。
-
DAG 调度器(DAG Scheduler): 将任务组织成串行或并行的阶段。
- 它将一张 DAG 图拆分为若干阶段的任务,并将它们放入资源管理器的任务队列中。
- 阶段 1:视频、音频和元数据。
- 在阶段 2 中,视频文件被进一步拆分为两个任务:视频编码和缩略图。
-
资源管理器(Resource Manager): 负责管理资源分配的效率。它 包含 3 个队列和一个任务调度器。
- 任务队列(Task queue):一个优先级队列,包含待执行的任务。
- 工作节点队列(Worker queue):一个优先级队列,包含工作节点的利用率信息。
- 运行队列(Running queue):包含当前正在运行的任务以及运行这些任务的工作节点。
- 任务调度器(Task scheduler):挑选最优的任务/工作节点,并指示选中的任务工作节点执行该作业。
-
任务工作节点(Task Workers): 执行转码及其他操作。
- 不同的任务工作节点可能运行不同的任务
-
临时存储(Temporary Storage): 存储中间数据,以便重试。
- 存储系统的选择取决于数据类型、数据大小、访问频率、数据生命周期等因素。
- 输出: 转码完成、可供分发的视频。
系统优化
速度优化
-
并行上传视频: 将视频拆分为更小的分块,以实现更快、可断点续传的上传。

-
分布式上传中心: 使用离用户较近的 CDN 作为上传中心。
-
并行处理: 使用消息队列解耦各模块,以实现高度并行。

安全优化
-
预签名 URL(Pre-Signed URLs): 只允许经过授权的用户上传视频。

-
保护视频:
- DRM 系统(例如 Apple FairPlay、Google Widevine)。
- AES 加密。
- 添加水印。
节省成本的优化
- 只通过 CDN 分发热门视频;不那么热门的视频由大容量服务器提供。
- 对很少被访问的视频按需编码。
- 根据热度对视频分发进行区域化。
- 自建 CDN,并与互联网服务提供商(ISP)合作,以降低带宽成本。
错误处理
可恢复错误
- 对失败的上传、转码或资源分配任务进行重试。
不可恢复错误
- 停止对格式错误视频的处理,并返回错误码。