第十四章 设计YouTube
本章要求设计YouTube
了解问题并确定设计范围
- 快速上传视频的能力
- 流畅的视频流
- 改变视频质量的能力
- 较低的基础设施成本
- 高可用性、可扩展性和可靠性要求
- 支持不同的客户端
高级设计
CDN 和 blob 存储将利用的云服务,Netflix 利用 Amazon 的云服务,Facebook 使用 Akamai 的 CDN的。
- 客户端:电脑、手机和智能电视
- CDN:视频存储在内容分化网络,当客户点击播放,视频将从内容分发网络中流式传输
- API服务器:除了视频流,其他所有内容都通过API服务器。包括信息流推荐、生成视频上传URL、更新元数据数据库和缓存、用户注册等
视频上传流程

组件
- 用户:终端
- 负载均衡:将请求均匀分发给多个API服务器
- API服务器:除了视频流,所有用户请求都经过API服务器
- Metadata DB:视频元数据和用户对象被缓存
- 原存储:blob存储系统用于存储原始视频。二进制大文件。
- 转码服务器:提供不同视频格式转换,为不同的设备和带宽提供最佳视频流
- 转码存储:它是一种用于存储转码视频文件的Blob存储
- CDN:视频存储在CDN中,点击播放时,视频将从CDN进行流式传输
- 完成队列:它是一种消息队列,用于存储有关视频转码完成事件的信息
- 完成处理程序:它由一组工作者组成,从完成队列中提取事件数据,并且更新元数据缓存和数据库
上传流程
分解为两个并行运行的流程:
- 上传原视频
- 更新视频元数据。元数据包含有关视频URL、大小、分辨率、格式、用户信息等信息
上传实际视频
- 视频上传到original storage
- 转码服务器从原服务器中获取视频进行转码
- 一旦转码完成进行以下操作:
3a. 转码后的视频被发送到转码存储
3b. 转码完成事件进入完成队列中排列
3a.1. 转码视频被分发到CDN
3b.1. 完成处理器包含了诸多服务器持续从队列中拉取事件数据
3a.1.a和3b.1.b 在视频转码完成后,完成处理程序更新元数据库和缓存 - API服务器通知客户端,视频已成功上传并进行流式传输
更新视频元数据
当在上传原视频时,客户端并行发送更新视频元数据的请求。请求包含视频元数据,包括文件名、大小、格式等。API服务器更新元数据缓存和元数据数据库。
视频传输流程
视频从CDN直接流式传输,距离最近的边缘服务器将提供视频,因此延迟较小。不同的视频编码和播放器需要不同的流协议的支持。
深入设计研究
通过重要优化来完善视频上传流程和视频流流程,并介绍错误处理机制。
视频转码
原因
- 数据压缩
- 设备和浏览器对视频格式的兼容
- 视频比特率的转换,高比特率更好的视频质量,但也要求更多的处理能力和联网速度
- 确保视频在不同网络条件下连续播放,支持质量转换
编码格式
编码格式可分为两个部分:
- 容器:包含视频文件、音频和元数据的篮子。容器格式类型可用文件扩展名实现,如.avi、.mov、.mp4
- 解编码器:减小视频大小同时保持视频质量的解压缩算法,如H.264、VP9和HEVC
视频转码流程
为了支持不同的视频处理流水线并保持较高的并行度,将视频处理任务整体抽象为模型是十分有必要的。例如Facebook将其定义为有向无环图模型。本章节采用类似的模型保证灵活性和并行度。
视频转码架构
预处理器:
- 视频分割:视频流就是一小组覆盖了几秒的图片集(GOP)段。每组都可以单独播放;
- 辅助旧终端进行视频分割
- 产生DAG:根据客户端程序编写的配置文件产生DAG
- 作为分段视频的缓存:将GOP和元数据存在临时存储器中,编码失败还可使用持久化数据重试
DAG调度器
将DAG图分割为多个任务阶段,并将他们放入资源管理器的任务队列中(直接拓扑排序)
资源管理器
- 任务调度器从任务队列中获取优先级最高的任务
- 从工作者队列中获取最优的工作者来运行任务
- 指示所选的工作者运行任务
- 将任务/工作者信息绑定并放入运行队列中
- 任务完成后从运行队列中删除该任务
任务工人
负责运行DAG中定义的任务
临时存储
由工人访问的数据较小的存储。元数据缓存在该内存中。视频和音频则放blob存储中,一旦视频处理完成,临时存储中数据就会被释放
系统优化
速度优化

- 通过GOP对齐将视频分割成更小的片段。
- 当之前的上传失败时可以允许快速恢复上传。
- 通过客户端实现GOP分割视频,提高上传速度
- 在全球范围内设置多个上传中心,实际使用CDN作为上传中心
- 通过消息队列构建一个松散耦合的系统,实现无处不在的并行性

安全性优化
为确保只有授权用户才可上传到正确位置,引入预签名URL

流程如下:
- 客户端向API服务器发出HTTP请求以获取预签名URL,授予URL标识对象的访问权限(Amazon S3:预签名,MicroSoft Azure:共享访问签名)
- APi服务响应签名
- 客户端收到响应,使用该预签名URL上传视频
安全优化
- 数字版权管理系统:主要有苹果(Apple)的 FairPlay、谷歌(Google)的 Widevine 和微软(Microsoft)的 PlayReady 三种 DRM 系统
- AES加密:对视频进行加密,并设置授权策略。在回放时,加密的视频会被解密,仅授权用户可观看。
- 水印
节省成本优化
全CDN成本过高,且有研究表明仅热门视频访问频率高,其他视频低或没有。考虑以下优化:
- 仅从CDN提供热门视频,其他视频由高容量服务器提供
- 节省非热门视频的各转码版本。短视频按需编码。
- 特定区域热门视频不需分发到其他区域
- 构建自己的CDN,类似于网飞和其它ISP的合作伙伴,提升观影经验并且降低带宽成本
优化之前都需要分析历史上观众的观看模式,以下是这些方面相关的优化点
存储服务器
错误处理
存在以下两种错误:
- 可恢复性错误:例如视频转码失败,重试几次操作,继续失败则认为不可恢复且向客户端返回适当的错误代码
- 非可恢复性错误:例如视频格式不正确,系统停止相关的运行任务并向客户报错
典型错误如下: - 上传错误:重试几次
- 分割视频错误:旧版本客户端无法通过GOP分割对齐视频,则整个上传到服务器由服务器执行
- 转码错误:重试
- 预处理器错误:重新生成 DAG 图
- DAG 调度错误:重新安排任务
- 资源管理器队列已满:使用副本
- 任务工作者已下线:在新的工作者上重试任务
- API 服务器已下线:API 服务器是无状态的,因此请求将被重定向到不同的 API 服务器
- 元数据缓存服务器已下线:数据是多次复制到多个服务器的。如果一个节点下线,您仍然可以访问其他节点来检索数据。可以启动一个新的缓存服务器
- 元数据数据库服务器已下线:• 主节点已下线。如果主节点已下线,则提升一个从节点作为新的主节点。• 从节点已下线。如果从节点已下线,则可以使用另一个从节点进行读取,并启动另一个数据库服务器来替换。参考数据库主从复制的内容。
额外要点
- 扩展API层:由于API服务器无状态,容易水平扩展
- 扩展数据库:数据库复制和分片
- 实时流媒体:对延迟要求更高,对并行要求低,选择不同的流媒体协议和错误处理剂,缩减处理时间
- 视频下架:上传中系统检测和用户标记检测
2025年7月30日阅读文档
浙公网安备 33010602011771号