Skip to content

第 14 章:设计 YouTube

简介

YouTube 是大型视频流媒体平台,支持上传、播放和各种互动。本章设计可扩展的视频流媒体系统,重点满足:

  • 快速上传视频
  • 流畅播放视频
  • 切换视频画质
  • 较低的基础设施成本
  • 高可用性与可靠性

关键统计数据(2020 年)

  • 20 亿月活跃用户
  • 每天观看 50 亿个视频
  • 37% 的移动互联网流量来自 YouTube
  • 支持 80 种语言
  • 2019 年广告收入为 151 亿美元

第一步:理解问题与范围

核心功能

  1. 上传视频。
  2. 观看视频。

支持的平台

  • 移动应用、网页浏览器和智能电视。

假设

  • **日活跃用户(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" />
  1. **客户端:**智能手机、计算机和电视等设备。
  2. **CDN(内容分发网络):**存储并传输视频。
  3. **API 服务器:**处理视频流传输以外的用户操作,如上传和元数据更新。
  4. **元数据数据库:**保存标题、描述、大小等视频元数据。
  5. **原始视频存储:**保存上传视频的对象存储。
  6. **转码服务器:**将视频转换为多种分辨率和格式。
  7. **转码后存储:**保存转码视频的对象存储。

核心流程

1. 视频上传流程

  • 并行过程:

    1. 将视频上传至原始视频存储。
    2. 更新数据库中的视频元数据。
  • 视频上传步骤:

      <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。
  • 不同协议支持不同的视频编码和播放器。

第三步:详细设计

视频转码

重要性

  1. 原始视频占用大量存储空间;转码压缩可降低占用。
  2. 保证不同设备和浏览器的兼容性。
  3. 根据网络状况调整画质。

组成概念

  • **容器:**封装视频、音频和元数据,如 MP4、AVI。
  • **编解码器:**压缩与解压缩算法,如 H.264、VP9。

有向无环图(DAG)模型

<img src="/images/chapter-14/dag-video-transcoding.png" alt="DAG 视频转码" width="600" />
  • 视频转码耗费大量计算资源和时间。

  • DAG 模型定义编码、生成缩略图、加水印等任务。

  • 视频处理任务因此可以高度并行。

  • 原始视频被拆分为视频、音频和元数据。

    • **视频编码:**转换成不同分辨率、编解码格式和码率。
    • **缩略图:**可以由用户上传,也可以由系统自动生成。
    • **水印:**叠加在视频上的图像,包含用于标识视频的信息。

视频转码架构

视频转码
  1. **预处理器:**将视频拆为更小的片段,并按 GOP(画面组)边界对齐,承担以下四项职责。

     <img src="/images/chapter-14/dag-config.png" alt="DAG 配置" width="500" />
    
    • 拆分视频流,形成按 GOP 对齐的小片段。
    • 为旧版客户端按 GOP 边界拆分视频。
    • 根据客户端程序员编写的配置文件生成 DAG。
    • 将 GOP 和元数据保存到临时存储;编码失败时可据此重试。
  2. **DAG 调度器:**把任务组织为顺序或并行执行的阶段。

     <img src="/images/chapter-14/dag-scheduler.png" alt="DAG 调度器" width="500" />
    
    • 将 DAG 拆分为任务阶段,并将任务放入资源管理器的任务队列。
    • 第一阶段处理视频、音频和元数据。
    • 第二阶段进一步将视频工作拆为编码和生成缩略图两个任务。
  3. **资源管理器:**高效分配资源,包含三个队列和一个任务调度器。

     <img src="/images/chapter-14/resource-manager.png" alt="资源管理器" width="700" />
    
    • **任务队列:**保存待执行任务的优先级队列。
    • **工作进程队列:**保存工作进程利用率信息的优先级队列。
    • **运行队列:**记录正在执行的任务及对应工作进程。
    • **任务调度器:**选择合适的任务和工作进程,并指示后者执行。
  4. **任务工作进程:**执行转码及其他操作。

     <img src="/images/chapter-14/task-worker.png" alt="任务工作进程" width="250" />
    
    • 不同工作进程可执行不同类型的任务。
  5. **临时存储:**保存中间数据,以便失败后重试。

    • 存储系统的选择取决于数据类型、大小、访问频率、生命周期等因素。
  6. **输出:**可供分发的转码后视频。


系统优化

速度优化

  1. **并行上传视频:**将视频拆成较小片段,加快上传并支持断点续传。

    视频拆分
  2. **分布式上传中心:**利用靠近用户的 CDN 节点作为上传入口。

  3. **并行处理:**通过消息队列解耦模块,提高并行度。

    消息队列消息队列

安全优化

  1. **预签名 URL:**只允许获得授权的用户上传视频。

    预签名 URL
  2. 保护视频:

    • DRM 系统,如 Apple FairPlay、Google Widevine。
    • AES 加密。
    • 添加水印。

成本优化

  1. 仅通过 CDN 分发热门视频;较冷门的视频由大容量服务器提供。
  2. 对很少访问的视频按需编码。
  3. 根据地区热度决定视频分发范围。
  4. 建立自有 CDN,并与互联网服务提供商合作,降低带宽成本。

错误处理

可恢复错误

  • 对上传、转码或资源分配失败的任务进行重试。

不可恢复错误

  • 停止处理格式错误的视频,并返回错误码。