系统设计-Ch14-设计YouTube
设计YouTube
在本章中,您被要求设计YouTube。这个问题的解决方案可以用于其它面试,比如设计B站、NetFlix和Hulu等视频共享平台。下图显示了YouTube主页:
YouTube看起来很简单:内容创作者上传视频,观众点击播放。
但真的那么简单么?并不是,简单的背后有许多复杂的技术。
让我们来看看2020年YouTube一些令人印象深刻的统计数据:
- 月活跃用户总数:20亿
- 用户每日观看的视频数量:50亿
- 73%的美国成年人使用YouTube
- YouTube上有5000万创作者
从这些数据中我们可以知道YouTube的体量是巨大的,能够带来许多收益。
Step1:Understand the problem and establish design scope
除了看视频,你还以在YouTube上做许多事情,例如:评论、点赞、分享和订阅等。我们不可能在一场短短的面试中设计出所有功能,因此提出问题来缩小范围是很重要的。
对于”设计YouTube“这个系统设计话题,我们可以向面试官提出以下问题:
Q:哪些功能很重要?
A:能够上传视频和观看视频
Q:我们需要支持哪些用户?
A:移动应用程序、Web浏览器和智能电视
Q:我们每天有多少活跃用户?
A:500万
Q:用户平均每天花在产品上的时间是多少?
A:30分钟
Q:我们需要支持国际用户么?
A: 是的,很大一部分是国际用户
Q:视频最高支持多少分辨率?
A:这个系统接受大多数视频分辨率格式,最高支持4K
Q:视频需要加密么?
A:是的
Q:视频的文件大小有什么要求么?有没有最高上限?
A:我们主打中小视频,因此视频上传大小最大为1GB
Q:我们能利用一些现有的云基础设施么?如亚马逊、谷歌、微软提供的云服务。
A:这是一个很好的问题。对大多数公司来说从零开始构建是不现实的,建议利用现有的第三方云服务
Step2:Propose high-level design and get buy-in
正如前面所说,面试官建议利用现有的云服务,而不是从头开始构建所有内容。CDN和blob存储是我们将利用的云服务。我们借助第三方bolb存储用于存储源视频,这里不展开讨论blob存储的详细设计。
在High-Level,该系统包含三个组件:
- Client:你可以在电脑、手机和智能电视上观看YouTube
- CDN:视频缓存在CDN服务器中,当您按下播放键时,会从CDN中播放视频。
- API Servers:除了视频流外,其它所有请求都通过API服务器,包括视频推荐、生成视频上传URL、更新元数据库和数据库缓存、用户注册等。
在问答环节,面试官对以下两个方面表现出兴趣:
- Video Uploading Flow(视频上传流程)
- Video Streaming Flow(视频流)
我们将探索这两个方面的高级设计。
Video Uploading Flow
下图展示了视频上传流程的所有组件:
它由以下组件组成:
Users:用户在电脑、手机或智能电视等设备上观看Youtube。
Load Balancer:负载均衡器在API Servers之间均匀地分配请求
API Servers:除了视频流外,所有请求都通过API Servers
MetaData DB:视频元数据存储在源数据库中,它是分片和复制的,以满足性能和高可用性需求
Original Stortage:bolob存储系统用于存储原始视频
Transcoding Servers:视频转码,它将视频格式转换为其它格式,用于不同设备的最佳视频流
Transcoding Stroage:这是一种存储转码视频文件的bolb存储
CDN:视频缓存在CDN中。
Completion Queue:完成队列,它是一个消息队列,存储有关视频转码完成事件的信息
Completion handler:它从完成队列中中提取事件数据并更新元数据缓存和数据库的Workers列表
现在我们分别了解了每个组件,让我们来看看视频上传流程是如何工作的:
流程被分解为两个并行运行的进程:
- a:Upload the actual video(上传实际视频)
- b:Update video metadata(更新视频元数据)
Flow a:upload the actual video
上图显示了如何上传实际视频:
- 视频上传到原始存储服务器
- 转码服务器从原始存储服务器中获取视频并开始转码
- 一旦转码完成,以下两个步骤将同时执行
- 转码的视频被发送到转码存储服务器
- 转码完成事件在完成队列中排队
- 将转码后的视频分发到CDN;Completion Hander从完成Completion Queue中提取事件数据
- Completion Hander更新元数据库和缓存
- API Servers通知Client视频已成功上传并准备好流式传输
Flow b:update the metadata
当一个文件被上传到原始存储时,客户端并行地发送一个更新视频元数据的请求,如下图所示:
请求包含视频元数据,包括文件名、大小、格式等;API服务器更新元数据缓存和数据库。
Video Streaming Flow
每当你在YouTube上观看视频时,它通常会立刻开始流媒体播放,而且你并不需要等待整个视频加载完毕。
这是因为流媒体技术,流媒体意味着您的设备不断接收来自服务器源视频的视频流,当你观看流媒体视频时,你的设备一次加载一点数据,这样你就可以立即连续地观看视频。
在讨论视频流之前,让我们先来了解一个重要的协议:流媒体协议。流媒体协议是控制视频流的标准方式。
目前常用的流媒体协议有以下几种:
- MPEG-DASH
- Dynamic Adaptive Streaming over HTTP
- Apple HLS. HLS stands for “HTTP Live Streaming”
- Microsoft Smooth Streaming
- Adobe HTTP Dynamic Streaming(HDS)
你不需要记住这些流媒体协议的名称,只需要注意不同的流媒体协议支持不同的视频编码和视频播放器。
视频直接从CDN流式传输–离您最近的服务器将提供视频,因此延迟非常小
Step3:Design deep dive
在高层设计中,整个系统分为两个部分,video uoloading flow和video streaming flow,在本章中,我们将使用重要的优化来完善这两个流程,并介绍错误处理机制。
video transcoding
录制视频时,设备会为视频文件提供特定格式。如果希望视频在其他设备上流畅播放,则必须将视频编码为其他设备上兼容的比特率和格式。较高的比特率意味着较高的视频质量。
DAG Model
对视频进行编码转换在计算上既昂贵又耗时。此外,不同的内容创作者可能会有不同的视频处理要求。例如,一些内容创作者要求在视频顶部添加水印,一些创作者自己提供视频缩略图,一些创作者本身会上传超高清视频。
为了支持不同的视频处理流程,并且保持高并发,添加一些抽象级别并让客户端程序员定义要执行的任务是很重要的。facebook的流媒体视频引擎使用有向无环图模型。该模型分阶段定义任务,以便可以顺序或并行执行任务。
下图展示了用于视频转码的DAG模型:
在上图中,原始视频被切分为了视频、音频和元数据。
对于视频:有检查视频完整性、视频编码、缩略图生成、水印生成等任务
continue
后面的内容都和前面讲的几章有重复,gop对齐也没什么亮点。就不搬运了
Step4:Warm up
在本章中,我们介绍了像youtube这样的视频流服务的架构设计。如果距离面试结束还有一段时间,这里还有几点可以和面试官讨论:
- 扩展API层:由于API服务器是无状态的,因此很容易横向扩展api层
- 扩展数据库:您可以讨论数据库复制和分片
- 直播:现在大部分视频网站都有直播内容,您可以与面试官讨论如何实时录制和播放视频的过程。
- 尽管我们的系统不是专门为直播而设计的,但直播和非直播有一些相似之处:都需要上传编码和流媒体协议
- 直播和非直播的显著区别在于:
- 但直播具有更高的延迟要求,因此可以需要不同的流媒体协议
- 直播对并行性要求低,因为小块数据已经实时处理
- 直播需要不同的错误处理,任何需要花费长时间的错误处理都是不可接受的
- 视频删除:违反版权、涩情火其他非法行为的视频应该被删除,一些可以在上传过程中被发现,而另一些可能通过用户标记(举报)发现
good job and goo luck!
本博客所有文章均采用 CC BY-NC-SA 4.0 协议 ,禁止商用,转载请注明出处!