第14章:YouTube的设计
简介
YouTube 是一个庞大的视频流媒体平台,支持视频上传、播放以及多种互动功能。本章将重点探讨如何设计一套可扩展的视频流媒体系统,其核心功能如下:
•
快速上传视频
•
流畅的视频播放
•
支持调整视频质量
•
基础设施成本低
•
高可用性和高可靠性
Key Statistics (2020)
•
每月活跃用户达20亿
•
每天播放50亿个视频
•
37%的移动互联网流量来自YouTube
•
支持80种语言
•
2019年广告收入达151亿美元
步骤1:明确问题与范围
Core Functionalities
上传视频
观看视频
Supported Platforms
•
移动应用、网页浏览器和智能电视
Assumptions
•
日活跃用户数(DAU):500万
•
平均视频大小:300 MB
•
上传限制:每段视频最大1 GB
•
每日存储需求:150 TB
•
CDN成本:500万次 × 5个视频 × 0.3GB × 0.02美元 = 每日15万美元(以Amazon CloudFront为例)
步骤2:概要设计
Components

客户端:如智能手机、电脑和电视等设备。
CDN(内容分发网络):存储并提供视频流服务。
API 服务器:负责处理所有用户交互,但不包括视频流传输(例如上传、元数据更新等)。
元数据数据库:存储视频元数据(例如标题、描述、大小等)。
原始存储:用于存储上传视频的Blob存储。
转码服务器:将视频转换为多种分辨率和格式。
转码后的存储:用于存放转码后视频的Blob存储。
Core Workflows
视频上传流程
•
并行处理:
a.
将视频上传至原始存储。
b.
在数据库中更新视频元数据。
视频上传(步骤):
•
[1] 视频被上传至 Blob 存储。
•
[2] 转码服务器将视频转换为多种格式。
•
[3] 一次转码完成后,接下来的两个步骤将并行执行。
◦
[3a] 转码后的视频被发送至转码存储。
◦
[3b] 转码完成事件被放入完成队列中。
•
[3a.1] 视频被分发至CDN。
•
[3b.1] 完成处理程序更新元数据并通知用户。
1.1
元数据上传(步骤):
•
客户端并行发送请求以更新视频元数据
•
该请求包含视频元数据,包括文件名、大小、格式等。
1.2
视频流媒体传输流程
•
视频通过边缘服务器直接从CDN进行流式传输,以最大限度地降低延迟。
•
一些流行的流媒体协议包括MPEG_DASH、Apple HLS和Adobe HDS。
•
不同的流媒体协议支持不同的视频编码和播放器。
步骤3:设计深度剖析
Video Transcoding
重要性
原始视频占用大量存储空间。它能减少存储空间。
确保跨设备和浏览器的兼容性。
根据网络状况自适应视频质量。
组件
•
容器:封装视频、音频及元数据(例如MP4、AVI)。
•
编解码器:用于压缩与解压缩的算法(例如H.264、VP9)。
有向无环图(DAG)模型
•
视频转码计算成本高且耗时。
•
DAG模型定义了编码、生成缩略图和添加水印等任务。
•
支持视频处理的高并行度。
•
原始视频被拆分为视频、音频和元数据。
Video Transcoding Architecture
预处理程序:将视频拆分为更小的片段(按GOP对齐)。它承担四项职责。
DAG调度器:将任务组织成顺序或并行的阶段。
资源管理器:负责管理资源分配的效率。它包含3个队列和一个任务调度器。
•
任务队列:一个包含待执行任务的优先级队列。
•
工作线程队列:一个包含工作线程利用率信息的优先级队列。
•
运行队列:包含当前正在执行的任务以及正在执行这些任务的工作线程。
•
任务调度器:选择最优的任务/工作节点,并指示所选的工作节点执行该任务。
任务工作者:执行转码及其他操作。
•
不同的任务工作者可能执行不同的任务
临时存储:用于存放重试的中间数据。
◦
存储系统的选型取决于数据类型、数据规模、访问频率、数据生命周期等因素。
输出:已转码的视频,可供分发。
系统优化
Speed Optimizations
并行视频上传:将视频拆分为更小的分片,以实现更快、可续传的上传。
分布式上传中心:将CDN用作靠近用户的上传枢纽。
并行处理:通过消息队列解耦各模块,实现高并发。
Safety Optimizations
预签名URL:限制视频上传仅限授权用户。
保护视频:
◦
DRM系统(例如,Apple FairPlay、Google Widevine)。
Cost-Saving Optimizations
仅通过CDN分发热门视频;冷门视频则由高容量服务器提供。
对访问频率极低的视频进行按需编码。
根据视频热度实现区域化分发。
构建定制化CDN,并与ISP合作以降低带宽成本。
错误处理
Recoverable Errors
•
重试失败的上传、转码或资源分配任务。
Non-Recoverable Errors
•
停止格式错误的视频处理并返回错误码。