系统设计面试笔记 第 14 章

第 14 章 设计 YouTube

简介

YouTube 是一个庞大的视频流媒体平台,支持视频上传、播放以及各种互动。本章重点设计一个可扩展的视频流媒体系统,它具备以下核心特性:

  • 快速上传视频
  • 流畅的视频播放
  • 可以切换视频清晰度
  • 较低的基础设施成本
  • 高可用性和可靠性

关键统计数据(2020 年)

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

第 1 步:理解问题并确定设计范围

核心功能

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

支持的平台

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

假设

  • 日活跃用户(DAU): 500 万
  • 平均视频大小: 300 MB
  • 上传限制: 每个视频最大 1 GB
  • 每日存储需求: 150 TB
  • CDN 成本: 5 million * 5 videos * 0.3GB * $0.02 = 每天 $150,000(使用 Amazon CloudFront)

第 2 步:高层设计

组件

高层设计
  1. 客户端: 智能手机、电脑和电视等设备。
  2. CDN(内容分发网络,Content Delivery Network): 存储视频并提供视频流。
  3. API 服务器: 处理除视频流播放之外的所有用户交互(例如上传、元数据更新)。
  4. 元数据数据库(Metadata Database): 存储视频元数据(例如标题、描述、大小)。
  5. 原始存储(Original Storage): 用于存放上传视频的 Blob 存储。
  6. 转码服务器(Transcoding Servers): 将视频转换为多种分辨率和格式。
  7. 转码后存储(Transcoded Storage): 用于存放转码后视频的 Blob 存储。

核心工作流程

1. 视频上传流程

  • 并行进行的过程:

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

    视频上传流程

    • [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)

重要性

  1. 原始视频会占用大量存储空间。转码可以减少存储空间。
  2. 确保在各种设备和浏览器上的兼容性。
  3. 根据网络状况调整视频清晰度。

组成部分

  • 容器(Container): 封装视频、音频和元数据(例如 MP4、AVI)。
  • 编解码器(Codecs): 压缩和解压缩算法(例如 H.264、VP9)。

有向无环图(Directed Acyclic Graph,DAG)模型

DAG 视频转码
  • 视频转码的计算开销大,而且耗时。
  • DAG 模型定义了编码、缩略图生成和添加水印等任务。
  • 使视频处理能够实现高度并行。

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

    • 视频编码:将视频转换为支持不同的分辨率、编解码器和码率。
    • 缩略图:既可以由用户上传,也可以由系统自动生成。
    • 水印:覆盖在视频之上的图像,包含视频的识别信息。

视频转码架构

视频转码
  1. 预处理器(Preprocessor): 将视频拆分为更小的分块(按 GOP 对齐)。它有 4 项职责。

    DAG 配置

    • 视频拆分:视频流被拆分(或进一步拆分)为更小的、按图像组(Group of Pictures,GOP)对齐的单元。
    • 它为旧客户端按 GOP 对齐来拆分视频。
    • 它根据客户端程序员编写的配置文件生成 DAG。
    • 它将 GOP 和元数据存储在临时存储中,这样一旦编码失败,系统就可以使用这些持久化的数据进行重试操作。
  2. DAG 调度器(DAG Scheduler): 将任务组织成串行或并行的阶段。

    DAG 调度器

    • 它将一张 DAG 图拆分为若干阶段的任务,并将它们放入资源管理器的任务队列中。
    • 阶段 1:视频、音频和元数据。
    • 在阶段 2 中,视频文件被进一步拆分为两个任务:视频编码和缩略图。
  3. 资源管理器(Resource Manager): 负责管理资源分配的效率。它 包含 3 个队列和一个任务调度器。

    资源管理器

    • 任务队列(Task queue):一个优先级队列,包含待执行的任务。
    • 工作节点队列(Worker queue):一个优先级队列,包含工作节点的利用率信息。
    • 运行队列(Running queue):包含当前正在运行的任务以及运行这些任务的工作节点。
    • 任务调度器(Task scheduler):挑选最优的任务/工作节点,并指示选中的任务工作节点执行该作业。
  4. 任务工作节点(Task Workers): 执行转码及其他操作。

    任务工作节点

    • 不同的任务工作节点可能运行不同的任务
  5. 临时存储(Temporary Storage): 存储中间数据,以便重试。

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

系统优化

速度优化

  1. 并行上传视频: 将视频拆分为更小的分块,以实现更快、可断点续传的上传。

    视频拆分

  2. 分布式上传中心: 使用离用户较近的 CDN 作为上传中心。

  3. 并行处理: 使用消息队列解耦各模块,以实现高度并行。

    消息队列 消息队列

安全优化

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

    预签名

  2. 保护视频:

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

节省成本的优化

  1. 只通过 CDN 分发热门视频;不那么热门的视频由大容量服务器提供。
  2. 对很少被访问的视频按需编码。
  3. 根据热度对视频分发进行区域化。
  4. 自建 CDN,并与互联网服务提供商(ISP)合作,以降低带宽成本。

错误处理

可恢复错误

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

不可恢复错误

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