第 14 章:设计 YouTube
简介
YouTube 是大型视频流媒体平台,支持上传、播放和各种互动。本章设计可扩展的视频流媒体系统,重点满足:
- 快速上传视频;
- 流畅播放视频;
- 切换视频画质;
- 较低的基础设施成本;
- 高可用性与可靠性。
关键统计数据(2020 年)
- 20 亿月活跃用户;
- 每天观看 50 亿个视频;
- 37% 的移动互联网流量来自 YouTube;
- 支持 80 种语言;
- 2019 年广告收入为 151 亿美元。
第一步:理解问题与范围
核心功能
- 上传视频。
- 观看视频。
支持的平台
- 移动应用、网页浏览器和智能电视。
假设
- **日活跃用户(DAU):**500 万。
- **平均视频大小:**300 MB。
- **上传限制:**每个视频最大 1 GB。
- **每天所需存储:**150 TB。
- **CDN 成本:**500 万 × 5 个视频 × 0.3 GB × $0.02 = 每天 $150,000(以 Amazon CloudFront 计)。
第二步:概要设计
组件
<img src="/images/chapter-14/high-level-design.png" alt="概要设计" width="400" />
- **客户端:**智能手机、计算机和电视等设备。
- **CDN(内容分发网络):**存储并传输视频。
- **API 服务器:**处理视频流传输以外的用户操作,如上传和元数据更新。
- **元数据数据库:**保存标题、描述、大小等视频元数据。
- **原始视频存储:**保存上传视频的对象存储。
- **转码服务器:**将视频转换为多种分辨率和格式。
- **转码后存储:**保存转码视频的对象存储。
核心流程
1. 视频上传流程
并行过程:
- 将视频上传至原始视频存储。
- 更新数据库中的视频元数据。
视频上传步骤:
<img src="/images/chapter-14/video-uploading-flow.png" alt="视频上传流程" width="500" />- [1] 将视频上传至对象存储。
- [2] 转码服务器将视频转换为多种格式。
- [3] 转码完成后,并行执行两个步骤:
- [3a] 将转码后的视频写入转码后存储。
- [3b] 将转码完成事件放入完成队列。
- [3a.1] 将视频分发至 CDN。
- [3b.1] 完成处理器更新元数据并通知用户。
元数据上传步骤:
<img src="/images/chapter-14/metadata-upload.png" alt="元数据上传" height="500" />- 客户端同时发送更新视频元数据的请求。
- 请求包含文件名、大小、格式等信息。
2. 视频流传输流程

- 视频直接由 CDN 边缘服务器传输,以降低延迟。
- 常见流媒体协议有 MPEG_DASH、Apple HLS 和 Adobe HDS。
- 不同协议支持不同的视频编码和播放器。
第三步:详细设计
视频转码
重要性
- 原始视频占用大量存储空间;转码压缩可降低占用。
- 保证不同设备和浏览器的兼容性。
- 根据网络状况调整画质。
组成概念
- **容器:**封装视频、音频和元数据,如 MP4、AVI。
- **编解码器:**压缩与解压缩算法,如 H.264、VP9。
有向无环图(DAG)模型
<img src="/images/chapter-14/dag-video-transcoding.png" alt="DAG 视频转码" width="600" />
视频转码耗费大量计算资源和时间。
DAG 模型定义编码、生成缩略图、加水印等任务。
视频处理任务因此可以高度并行。
原始视频被拆分为视频、音频和元数据。
- **视频编码:**转换成不同分辨率、编解码格式和码率。
- **缩略图:**可以由用户上传,也可以由系统自动生成。
- **水印:**叠加在视频上的图像,包含用于标识视频的信息。
视频转码架构

**预处理器:**将视频拆为更小的片段,并按 GOP(画面组)边界对齐,承担以下四项职责。
<img src="/images/chapter-14/dag-config.png" alt="DAG 配置" width="500" />- 拆分视频流,形成按 GOP 对齐的小片段。
- 为旧版客户端按 GOP 边界拆分视频。
- 根据客户端程序员编写的配置文件生成 DAG。
- 将 GOP 和元数据保存到临时存储;编码失败时可据此重试。
**DAG 调度器:**把任务组织为顺序或并行执行的阶段。
<img src="/images/chapter-14/dag-scheduler.png" alt="DAG 调度器" width="500" />- 将 DAG 拆分为任务阶段,并将任务放入资源管理器的任务队列。
- 第一阶段处理视频、音频和元数据。
- 第二阶段进一步将视频工作拆为编码和生成缩略图两个任务。
**资源管理器:**高效分配资源,包含三个队列和一个任务调度器。
<img src="/images/chapter-14/resource-manager.png" alt="资源管理器" width="700" />- **任务队列:**保存待执行任务的优先级队列。
- **工作进程队列:**保存工作进程利用率信息的优先级队列。
- **运行队列:**记录正在执行的任务及对应工作进程。
- **任务调度器:**选择合适的任务和工作进程,并指示后者执行。
**任务工作进程:**执行转码及其他操作。
<img src="/images/chapter-14/task-worker.png" alt="任务工作进程" width="250" />- 不同工作进程可执行不同类型的任务。
**临时存储:**保存中间数据,以便失败后重试。
- 存储系统的选择取决于数据类型、大小、访问频率、生命周期等因素。
**输出:**可供分发的转码后视频。
系统优化
速度优化
**并行上传视频:**将视频拆成较小片段,加快上传并支持断点续传。

**分布式上传中心:**利用靠近用户的 CDN 节点作为上传入口。
**并行处理:**通过消息队列解耦模块,提高并行度。


安全优化
**预签名 URL:**只允许获得授权的用户上传视频。

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