第十四章 设计YouTube

本章要求设计YouTube

了解问题并确定设计范围

  • 快速上传视频的能力
  • 流畅的视频流
  • 改变视频质量的能力
  • 较低的基础设施成本
  • 高可用性、可扩展性和可靠性要求
  • 支持不同的客户端

高级设计

CDN 和 blob 存储将利用的云服务,Netflix 利用 Amazon 的云服务,Facebook 使用 Akamai 的 CDN的。

  • 客户端:电脑、手机和智能电视
  • CDN:视频存储在内容分化网络,当客户点击播放,视频将从内容分发网络中流式传输
  • API服务器:除了视频流,其他所有内容都通过API服务器。包括信息流推荐、生成视频上传URL、更新元数据数据库和缓存、用户注册等

视频上传流程

ch14-1

组件

  • 用户:终端
  • 负载均衡:将请求均匀分发给多个API服务器
  • API服务器:除了视频流,所有用户请求都经过API服务器
  • Metadata DB:视频元数据和用户对象被缓存
  • 原存储:blob存储系统用于存储原始视频。二进制大文件。
  • 转码服务器:提供不同视频格式转换,为不同的设备和带宽提供最佳视频流
  • 转码存储:它是一种用于存储转码视频文件的Blob存储
  • CDN:视频存储在CDN中,点击播放时,视频将从CDN进行流式传输
  • 完成队列:它是一种消息队列,用于存储有关视频转码完成事件的信息
  • 完成处理程序:它由一组工作者组成,从完成队列中提取事件数据,并且更新元数据缓存和数据库

上传流程

分解为两个并行运行的流程:

  1. 上传原视频
  2. 更新视频元数据。元数据包含有关视频URL、大小、分辨率、格式、用户信息等信息
上传实际视频
  1. 视频上传到original storage
  2. 转码服务器从原服务器中获取视频进行转码
  3. 一旦转码完成进行以下操作:
    3a. 转码后的视频被发送到转码存储
    3b. 转码完成事件进入完成队列中排列
    3a.1. 转码视频被分发到CDN
    3b.1. 完成处理器包含了诸多服务器持续从队列中拉取事件数据
    3a.1.a和3b.1.b 在视频转码完成后,完成处理程序更新元数据库和缓存
  4. API服务器通知客户端,视频已成功上传并进行流式传输
更新视频元数据

当在上传原视频时,客户端并行发送更新视频元数据的请求。请求包含视频元数据,包括文件名、大小、格式等。API服务器更新元数据缓存和元数据数据库。

视频传输流程

视频从CDN直接流式传输,距离最近的边缘服务器将提供视频,因此延迟较小。不同的视频编码和播放器需要不同的流协议的支持。

深入设计研究

通过重要优化来完善视频上传流程和视频流流程,并介绍错误处理机制。

视频转码

原因

  1. 数据压缩
  2. 设备和浏览器对视频格式的兼容
  3. 视频比特率的转换,高比特率更好的视频质量,但也要求更多的处理能力和联网速度
  4. 确保视频在不同网络条件下连续播放,支持质量转换

编码格式

编码格式可分为两个部分:

  • 容器:包含视频文件、音频和元数据的篮子。容器格式类型可用文件扩展名实现,如.avi、.mov、.mp4
  • 解编码器:减小视频大小同时保持视频质量的解压缩算法,如H.264、VP9和HEVC

视频转码流程

为了支持不同的视频处理流水线并保持较高的并行度,将视频处理任务整体抽象为模型是十分有必要的。例如Facebook将其定义为有向无环图模型。本章节采用类似的模型保证灵活性和并行度。

视频转码架构

预处理器:
  1. 视频分割:视频流就是一小组覆盖了几秒的图片集(GOP)段。每组都可以单独播放;
  2. 辅助旧终端进行视频分割
  3. 产生DAG:根据客户端程序编写的配置文件产生DAG
  4. 作为分段视频的缓存:将GOP和元数据存在临时存储器中,编码失败还可使用持久化数据重试
DAG调度器

将DAG图分割为多个任务阶段,并将他们放入资源管理器的任务队列中(直接拓扑排序)

资源管理器
  • 任务调度器从任务队列中获取优先级最高的任务
  • 从工作者队列中获取最优的工作者来运行任务
  • 指示所选的工作者运行任务
  • 将任务/工作者信息绑定并放入运行队列中
  • 任务完成后从运行队列中删除该任务
任务工人

负责运行DAG中定义的任务

临时存储

由工人访问的数据较小的存储。元数据缓存在该内存中。视频和音频则放blob存储中,一旦视频处理完成,临时存储中数据就会被释放

系统优化

速度优化

ch14-2

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

ch14-3

安全性优化

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

ch14-4

流程如下:

  1. 客户端向API服务器发出HTTP请求以获取预签名URL,授予URL标识对象的访问权限(Amazon S3:预签名,MicroSoft Azure:共享访问签名)
  2. APi服务响应签名
  3. 客户端收到响应,使用该预签名URL上传视频
安全优化
  • 数字版权管理系统:主要有苹果(Apple)的 FairPlay、谷歌(Google)的 Widevine 和微软(Microsoft)的 PlayReady 三种 DRM 系统
  • AES加密:对视频进行加密,并设置授权策略。在回放时,加密的视频会被解密,仅授权用户可观看。
  • 水印

节省成本优化

全CDN成本过高,且有研究表明仅热门视频访问频率高,其他视频低或没有。考虑以下优化:

  1. 仅从CDN提供热门视频,其他视频由高容量服务器提供
  2. 节省非热门视频的各转码版本。短视频按需编码。
  3. 特定区域热门视频不需分发到其他区域
  4. 构建自己的CDN,类似于网飞和其它ISP的合作伙伴,提升观影经验并且降低带宽成本
    优化之前都需要分析历史上观众的观看模式,以下是这些方面相关的优化点
存储服务器
错误处理

存在以下两种错误:

  • 可恢复性错误:例如视频转码失败,重试几次操作,继续失败则认为不可恢复且向客户端返回适当的错误代码
  • 非可恢复性错误:例如视频格式不正确,系统停止相关的运行任务并向客户报错
    典型错误如下:
  • 上传错误:重试几次
  • 分割视频错误:旧版本客户端无法通过GOP分割对齐视频,则整个上传到服务器由服务器执行
  • 转码错误:重试
  • 预处理器错误:重新生成 DAG 图
  • DAG 调度错误:重新安排任务
  • 资源管理器队列已满:使用副本
  • 任务工作者已下线:在新的工作者上重试任务
  • API 服务器已下线:API 服务器是无状态的,因此请求将被重定向到不同的 API 服务器
  • 元数据缓存服务器已下线:数据是多次复制到多个服务器的。如果一个节点下线,您仍然可以访问其他节点来检索数据。可以启动一个新的缓存服务器
  • 元数据数据库服务器已下线:• 主节点已下线。如果主节点已下线,则提升一个从节点作为新的主节点。• 从节点已下线。如果从节点已下线,则可以使用另一个从节点进行读取,并启动另一个数据库服务器来替换。参考数据库主从复制的内容。

额外要点

  • 扩展API层:由于API服务器无状态,容易水平扩展
  • 扩展数据库:数据库复制和分片
  • 实时流媒体:对延迟要求更高,对并行要求低,选择不同的流媒体协议和错误处理剂,缩减处理时间
  • 视频下架:上传中系统检测和用户标记检测

2025年7月30日阅读文档

posted @ 2025-07-31 01:26  tanch25  阅读(13)  评论(0)    收藏  举报