06 | 短视频系统设计:如何支持三千万用户同时在线看视频?

你好,我是李智慧。

短视频(short video)通常时长在15分钟以内,主要是在移动智能终端上进行拍摄、美化编辑或加特效,并可以在网络社交平台上进行实时分享的一种新型视频形式。短视频具有时间短、信息承载量高等特点,更符合当下网民手机使用行为习惯,短视频的用户流量创造了巨大的商机。

我们准备开发一个面向全球用户的短视频应用,用户总量预计20亿,应用名称:QuickTok。

视频文件和其他媒体文件相比,会更大一点,这就意味着存储短视频文件需要更大的存储空间,播放短视频也需要更多的网络带宽。因此,QuickTok的主要技术挑战是:如何应对高并发用户访问时的网络带宽压力,以及如何存储海量的短视频文件。接下来我们就来看看QuickTok的需求与技术架构。

需求分析

QuickTok的核心功能需求非常简单:用户上传视频、搜索视频、观看视频。我们将主要分析非功能需求。

QuickTok预计用户总量为20亿,日活用户约10亿,每个用户平均每天浏览10个短视频,由此可以预估,短视频日播放量为100亿:

$\small 10亿\times10=100亿$

平均播放QPS为11万/秒:

$\small 100亿\div(24\times60\times60)\approx11万/秒$

每秒11万用户点击视频,假设用户平均观看5分钟,那么同时在观看的视频数就是:

$\small 11万/秒\times5\times60秒=3千万$

假设每个短视频的平均播放次数200次,那么为了支撑这样体量的播放量,平均需要每秒上传视频数:

$\small 11万/秒\div200=550/秒$

每个短视频平均大小100MB,每秒上传至服务器的文件大小为:

$\small 100MB\times550=55GB$

(视频虽然不是一秒内上传至服务器的,但是这样计算依然没有问题。)

每年新增视频需要的存储空间:

$\small 55GB\times60\times60\times24\times365=1700PB$

事实上,为了保证视频数据的高可用,不会因为硬盘损坏导致数据丢失,视频文件需要备份存储,QuickTok采用双副本的备份存储策略,也就是每个视频文件存储三份,需要的总存储空间:

$\small 1700PB\times3=5200PB$

而播放视频需要的总带宽:

$\small 11万\times100MB\times8bit=88Tb$

因此,我们需要设计的短视频应用是一个每秒上传550个视频文件、11万次播放、新增165GB存储以及88Tb总带宽的高并发应用系统。这个系统呢需要是高性能的,能迅速响应用户的上传和播放操作,也需要是高可用的,能面向全球用户提供7 * 24小时稳定的服务。

概要设计

QuickTok的核心部署模型如下图。

图片

用户上传视频时,上传请求会通过负载均衡服务器和网关服务器,到达视频上传微服务。视频上传微服务需要做两件事:一是把上传文件数据流写入视频文件暂存服务器;二是把用户名、上传时间、视频时长、视频标题等视频元数据写入分布式MySQL数据库。

视频文件上传完成后,视频上传微服务会生成一个视频上传完成消息,并将其写入到消息队列服务器。视频内容处理器将消费这个上传完成消息,并根据消息内容,从视频文件暂存服务器获取视频文件数据,进行处理。

视频内容处理器是一个由责任链模式构建起来的管道。在这个管道中,视频将会被顺序进行内容合规性审查、内容重复性及质量审查、内容标签生成、视频缩略图生成、统一视频转码处理等操作,如下图。

图片

合规且非重复的视频会经过统一转码,最终被写入分布式文件存储和CDN。这样视频上传处理就完成了,具体时序图如下。

图片

以上就是对视频上传环节的设计,接下来我们将讨论对视频搜索及播放部分的设计,即核心部署模型图中标红的部分,如下。

图片

视频搜索引擎会根据用户提交的视频标题、上传用户等元数据,以及视频内容处理器生成的内容标签构建倒排索引。当用户搜索视频时,系统会根据倒排索引来检索符合条件的视频,并返回结果列表。结果列表在App端向用户呈现时,会将此前视频内容处理器生成的缩略图展现给用户,使用户对视频内容有个初步而直观的感受。

当用户点击缩略图时,App开始播放视频。App并不需要下载完整个视频文件才开始播放,而是以流的方式一边下载视频数据,一边播放,使用户尽量减少等待,获得良好的观看体验。QuickTok使用MPEG–DASH流媒体传输协议进行视频流传输,因为这个协议具有自适应能力,而且支持HTTP,可以应对QuickTok的视频播放需求。

详细设计

为解决QuickTok的两个重要问题:如何存储海量视频文件?如何解决高并发视频播放导致的带宽压力?详细设计将关注视频存储系统、性能优化与CDN。

此外,“如何生成更吸引用户的缩略图”是短视频应用用户体验的一个关键问题,详细设计也会关注缩略图生成与推荐的设计实现。

视频存储系统设计

由需求分析可知,QuickTok每年新增5200PB的存储。因此,“如何存储海量视频文件”就是QuickTok设计的重要挑战之一。对此,我们可以尝试与网盘相同的存储技术方案,将视频文件拆分成若干block,使用对象存储服务进行存储。

但QuickTok最终采用了另一种存储方案,即使用Hadoop分布式文件系统HDFS进行存储。HDFS适合大文件存储的一次写入多次读取的场景,满足视频一次上传多次播放的需求;同时,它还可以自动进行数据备份(缺省配置下,每个文件存储三份),也满足我们关于数据存储高可用的需求。

HDFS适合存储大文件,大文件减少磁盘碎片,更有利于存储空间的利用,同时HDFS NameNode的访问压力也更小,所以我们需要把若干个视频文件合并成一个HDFS文件进行存储,并将存储相关的细节记录到HBase中。

图片

举个例子,当用户上传一个视频文件,系统会自动生成一个视频ID,这里假设这个ID是123。视频内容处理器先对视频进行一系列处理,再调用视频文件存储服务来进行存储。

存储服务首先通过HDFS创建一个文件,比如/data/videos/clust0/p0/000000001,然后将视频文件数据顺序写入到HDFS中。写完后,存储服务就可以得到这个HDFS文件的全路径名(/data/videos/clust0/p0/000000001)、视频文件在HDFS中的偏移量0、文件大小99,000,000B。

然后,视频文件存储服务再将这些信息记录到HBase中,主键就是视频ID<123>,value就是<path:/data/videos/clust0/p0/000000001, offset:0, size:99,000,000>。

假设另一个用户上传的视频ID为456,文件大小100,000,000B,紧随着上一个视频文件,也保存到同一个HDFS文件中。那么HBase中就可以记录主键<456>,value<path:/data/videos/clust0/p0/000000001, offset:99,000,000, size:100,000,000>。

当其他用户播放视频456时,播放微服务根据主键ID在HBase中查找value值,得到HDFS文件路径/data/videos/clust0/p0/000000001,从该文件99,000,000偏移位置开始读取100,000,000Byte数据,就是视频ID 456完整的文件数据了。

性能优化与CDN设计

我们前面分析过,QuickTok需要的总带宽是88Tb,这是一个非常巨大的数字。如果单纯靠QuickTok自己的数据中心来承担这个带宽压力,技术挑战和成本都非常巨大。只有通过CDN将用户的网络通信请求就近返回,才能缓解数据中心的带宽压力。

App请求获取视频数据流的时候,会优先检查离自己比较近的CDN中是否有视频数据。如果有,直接从CDN加载数据,如果没有,才会从QuickTok数据中心获取视频数据流。

如果用户的大部分请求都可以通过CDN返回,那么一方面可以极大加快用户请求的响应速度,另一方面又可以较大缓解数据中心的网络和硬盘负载压力,进一步提升应用整体的性能。

通常的CDN设计,是在CDN中没有用户请求的数据时,进行回源,即由CDN请求数据中心返回需要的数据,然后缓存在CDN本地。

但QuickTok考虑到了短视频的特点:大V、网红们发布的短视频会被更快速、更广泛地播放。因此针对粉丝量超过10万的用户,系统将采用主动推送CDN的方法,以提高CDN的命中率,优化用户体验,如图:

图片

从图中可以看出,视频内容处理器进行完视频处理后,一方面会将视频存储到前面说过的视频存储系统中,另一方面又会调用CDN推送服务。然后,CDN推送服务将调用大数据平台,获取视频上传者的活跃粉丝数、粉丝分布区域等数据。如果是10万粉丝以上的用户发布了短视频,CDN推送服务会根据其粉丝活跃的区域,将视频推送到对应区域的CDN服务器上。

短视频的完播率通常不足30%,所以QuickTok也不需要将完整视频推送到CDN,只需要根据视频发布者的历史播放记录,计算其完播率和播放期望进度,然后将短视频切分成若干chunk,将部分chunk推送到CDN即可。

业界一般共识,视频应用CDN处理的带宽大约占总带宽的95%以上,也就是说,通过合理使用CDN,QuickTok数据中心需要处理的带宽压力大约4Tb。

缩略图生成与推荐设计

用户可以通过App主页、搜索结果页、视频推荐页等页面看到视频列表,其中每个视频都需要有个缩略图。用户点击缩略图,就开始播放视频。

缩略图通常是由视频的某一帧画面缩略而生成的。事实上,缩略图的选择会极大地影响用户点击、播放视频的意愿。一个10分钟的视频大约包含3万帧画面,选择哪一帧画面,才能使用户点击视频的可能性最大?以及,针对不同的用户分类,是否选择不同的缩略图会产生更高的点击率?

我们需要通过大数据平台的机器学习引擎来完成缩略图的生成和推荐,如下图。

图片

缩略图的生成和推荐可以分为两个具体过程:

  • 实时在线的缩略图推荐过程a;
  • 利用离线机器学习生成优质缩略图的过程b。

a过程中,用户通过搜索引擎搜索视频,搜索引擎产生搜索结果视频列表后,根据视频ID从缩略图存储中获取对应的缩略图。

但是,一个视频可能对应很多个缩略图,如果想要显示最吸引当前用户的那个,搜索引擎就需要调用QuickTok大数据平台的缩略图推荐引擎进行推荐。

推荐引擎可以获取当前用户的偏好特征标签以及视频对应的多个缩略图特征,使用XGboost算法训练好的模型,将用户特征标签和缩略图特征进行匹配,然后返回最有可能被当前用户点击的缩略图ID。搜索引擎再按照ID,将对应的缩略图构建到搜索结果页面,返回给用户。

用户浏览搜索结果列表,点击某些缩略图进行播放。App应用会将用户的浏览与点击数据发送给QuickTok大数据平台,这样就进入了利用机器学习来生成优质缩略图的过程b。

机器学习系统获取到了海量用户的浏览和点击数据,同时获取每个缩略图的特征。一方面,机器可以学习到,哪些特征的缩略图更容易获得用户点击,从而生成优质缩略图特征标签库;另一方面,机器还可以学习到每个用户自身更偏好的图像特征标签,供前面提到的推荐引擎使用。

有了机器学习系统的加持,视频内容处理器就可以使用优质特征标签库来处理上传的视频内容,抽取符合优质特征的帧,进而生成缩略图。

以上的a、b两个过程不断循环迭代,系统就可以不断优化优质特征标签库,不断使缩略图更符合用户喜好。

那最开始没有特征库的时候怎么办呢?视频内容处理器可以使用随机的办法,抽取一些帧作为缩略图,进行冷启动。机器学习再从这些随机抽取的缩略图上开始学习,从而进入循环优化过程。

小结

我们在缩略图生成部分,使用了大数据和机器学习的一些技术,如果你不熟悉,可能会觉得有点困难。但是现在人工智能和机器学习几乎是稍具规模的互联网系统的标配,架构师作为整个系统的设计者、技术负责人,可能对算法的细节无法做出具体的优化,但是对于算法在整个架构中的作用、相关数据的处理和流转必须非常熟悉,才能设计出满足业务需要的架构方案。

所以,大数据和机器学习的原理和应用方法应该是架构师技能栈的一部分,能够和算法工程师顺畅讨论技术细节是架构师必备的能力。如果你对这部分知识掌握不完整,可以阅读专栏《从0开始学大数据》

思考题

不止是缩略图的选择需要用到推荐算法,视频内容本身也需要推荐算法:当用户播放完一个视频,QuickTok需要给用户自动播放下一个视频,以此增强用户粘性。那么下一个视频应该播放什么?你是否可以参考文中的缩略图生成与推荐架构图,自己画一个视频推荐的架构图?如果能说说你的设计思路就更好了。

欢迎在评论区分享你的思考,或者提出对这个设计文档的评审意见,我们共同进步。

精选留言

  • Geek2014

    2022-03-12 02:39:40

    老师能不能关于某些架构设计多写一些取舍, 让读者知道what,why,how 。就拿这篇举例子的话老师并没有说出网盘海量储存和这次hfds的取舍。只是说了使用hdfs。不然会看起来就只知其然。我想读者可能更需要不仅仅需要抛砖引玉
    作者回复

    一方面,我们的文章是按设计文档的规范写作的,设计文档一般只描述设计结果,不描述为什么这么设计,否则设计文档就变成一篇论文了,设计文档的目的是为了开发落地实现,不是为了讨论架构的优劣。

    另一方面,架构方案很多时候本身也没有优劣之分,几种方案其实都可以,短视频用HDFS或者Ceph这样块存储哪个好?根据公开资料,快手用了HDFS,YouTube早期用了Amazon S3,都可以。

    但是,用了不同的技术方案,因为不同技术方案特点不同,相关系统设计也有很大不同,我们这个案例用了HDFS,就要关注文件合并存储,存储格式,索引方式这些问题,文章想展示的也正是这些。

    也许我们可以专门写一些文章讲架构方案的取舍,以及取舍后落地实现的差异。大家有什么想法,欢迎一起交流讨论。

    2022-03-14 10:59:07

  • peter

    2022-02-28 22:34:13

    请教老师几个问题啊:
    Q1:视频为什么要进行“转码”处理?
    Q2:视频搜索引擎为什么要用“倒排索引”?
    Q3:如果手机不支持MPEG-DASH协议怎么办?
    服务器端采用MPEG-DASH协议,但如果手机不支持怎么办?
    Q4:视频上传用什么协议? http吗?
    Q5:实际开发中,视频上传/下载用框架还是自己开发?有什么框架?
    Q6:合规检查一般怎么做的?
    Q7:本例子的成本大约多少?
    带宽费用多少?服务器费用大约多少?视频网站需要大带宽和大量服务器,是不是成本很高啊?本文中的例子,成本估计多少?100亿吗?(写文档需要估算成本,所以请教一下)
    作者回复

    1 我们这个场景需要进行两种转码,一种是用户上传的不同的视频编码格式需要统一转码成平台格式;一种是转码成不同清晰度的视频文件,根据用户带宽和会员等级进行传输。
    2 视频搜索也是按照关键词进行搜索,我们需要按照标题,视频简介等内容进行搜索,本质是文本搜索。
    3 手机端是App,是自己开发的,不存在不支持
    4 视频上传可以支持多种协议,根据用户网络状况选择
    6 AI检查为主,人工检查为辅
    7 文中这个例子,支持20亿用户,100亿成本应该是远远不够的

    2022-03-01 10:35:40

  • 👽

    2022-03-02 07:52:15

    我觉得,推荐算法有这么几个
    1 用户习惯。首先应该收集用户历史播放记录,播放时长,完播记录,定位出用户的喜好。算出第一个推荐包。
    2 相关视频。有什么和当前视频关联度高的视频。包括,标签相似,点赞该视频的用户点赞的其他视频等。这是第二个推荐包。
    3 视频作者。这个跟第一个有点类似。当前视频作者有什么其他作品,有什么类似的视频作者。推荐这些作者的高质量视频。
    4当然还会有很多很多其他属性的推荐


    接着及后续的用户行为,会进一步更新推荐算法。分别更新对于此用户用户习惯,和整个平台的全局推荐算法的相关权重。

    然后根据这个权重再推荐视频,再根据用户行为更新权重,推荐视频,更新权重……无限套娃。

    当然,不仅限于此,系统后台还会有任务再学习总结用户习惯。比如给某视频点赞的普遍是什么标签的用户等等。总之就是个无限优化的过程。
    作者回复

    不错

    2022-03-02 10:36:12

  • neohope

    2022-04-28 11:29:48

    QuickTok其实还有两个很难做的工作要做:
    1、视频编解码及压缩:各种格式的视频上传后,需要把各种视频编码转换为同一编码,而且为了适应各种设备及带宽,还需要将视频压缩为多种分别率。这个工作完成后,才会去推送CDN。
    2、视频合规性检查:视频内容、音频内容、视频中的文字,也涉及到大量的深度学习训练,并辅助以用户反馈、人工审查等。

    视频内容推荐有多种方式:
    1、根据视频的推荐:每个视频通过标签转换为向量,推荐时,使用用户当前观看的视频向量,查找类似的视频
    2、根据用户的推荐:每个用户的标签转换为向量,先查找匹配类似用户,然后在类似用户中,选择评价好的视频进行推荐
    3、根据关注的大V、好友或话题的推荐:大V好友喜欢的主播或视频,通过向量匹配推荐过来。在相同话题下的主播或视频,通过向量匹配推荐过来。
    4、全站热门话题推荐;根据所在区域,选择热门话题进行推荐;根据所在行业,选择热门话题进行推荐;
    5、广告及推广推荐:根据用户特征,匹配广告潜在用户特征,进行推荐;根据用户近期该兴趣的内容,比如搜索内容,进行推荐;
    6、各种推荐算法,用一定比例混合,辅助一些实验性的视频推荐,最后呈现给用户;
    7、还要收集用户体验相关信息,不短的对上述模型及标签进行迭代;
    作者回复

    2022-05-05 11:35:08

  • 2022-06-01 22:09:08

    记流水账似的文章
  • ABC

    2022-03-22 08:18:29

    老师,有个疑问,视频元数据为什么不考虑ES来存储呢?
    作者回复

    文中的搜索引擎子系统就是用ES实现的。你的意思是不经过MySQL,数据直接写入ES?这个不合适吧,事务怎么保证,可用性怎么保证?

    2022-03-22 10:55:43

  • A9

    2022-03-14 00:13:51

    文中说到,对于短视频读多于写的这种场景,选择了HDFS进行存储。Ceph和HDFS都是成熟的分布式存储系统,请问这两个一般情况下应该如何抉择呢?
    作者回复

    HDFS适合海量大文件,典型场景:机器学习等大数据场景。
    Ceph适合海量中小文件,典型场景:云相册。

    2022-03-14 09:30:49

  • linuxcoder

    2022-04-10 04:39:27

    老师,存储时候我们把几个视频文件合并存成一个大概55GB的文件存在HDFS上,那如果遇到删除视频文件,怎么处理?还是删除的时候我们只在元数据进行删除,实际存储在HDFS上的视频文件不删除?
    作者回复

    是的,不删除物理文件

    2022-04-11 09:40:24

  • 丫丫

    2022-03-13 09:06:00

    请问视频一般是压缩的,那么怎么获取缩略图。
    怎么存储缩略图,如果一个10min 60hz的4K视频存每一帧来进行分析的话,那么就是4K*36000 = 100M,岂不是很费空间
    作者回复

    视频并不是压缩,而是视频文件协议本身就是自带压缩,OpenCV之类的工具可以从视频文件中提取任何一帧的图片,OpenCV也提供缩略图片的函数。
    我们不需要把每一帧都存储成缩略图,缩略图的用途是做视频的封面,一张就够了。我们提取多张缩略图是为了推荐引擎挑选最能吸引用户的哪一张,有十几张或者几十张也够了。
    另外,4K视频的每一帧图片大概是几M,不是4K,缩略图大概几十K

    2022-03-14 10:47:27

  • hph

    2022-02-28 09:40:26

    老师,短视频和云盘都有一个共同点就是网络带宽要求很高(不考虑CDN),给用户下载文件的服务器集群面对这么大带宽需求,该如何设计和实现,能说的更详细一些吗,比如服务节点的数量,具体传输是如何做的,传输过程是直接用tcp吗,tcp的话断连续传如何做,短视频一边下载一边播放又是大概怎么做的,等等问题
    作者回复

    CDN提供短视频95%以上的响应带宽,不能不考虑CDN

    2022-02-28 10:32:56

  • zhaobk

    2022-03-03 09:39:21

    老师好,在视频文件存储的时候,为什么要把多个视频文件存储到一个hdfs文件中呢?是因为存储为一个大文件读取速度快吗?这个大文件要控制在多大合适呢?
    作者回复

    合并一个文件主要是为了减少HDFS block碎片,看下这两个数字:block缺省大小64MB,视频文件不超过100MB。
    大文件控制在每秒上传的视频存在一个文件较合适,也就是55GB

    2022-03-03 10:35:18

  • ball

    2022-08-18 16:41:06

    老师,想问几个问题。
    1. 图片为什么用HBASE存,也放分布式存储中不可以么?
    2. 此外,这些图片最终也要通过CDN分发给用户吧?
    作者回复

    1 缩略图,通常只有几KB,而且访问更频繁,用HBase效率更高
    2 是的,缩略图有自己的url,可以使用CDN

    2022-08-22 10:33:09

  • 此方为名

    2022-03-11 09:35:30

    合并视频文件如何删除?这样做是否会让碎片化更严重,或磁盘利用率更低?
    作者回复

    不会物理删除视频,只会在MySQL元数据库里做标记、
    这个应该是数据库的常规操作,重要的数据通常都不会物理删除的,数据库记录本身也不会删除。

    2022-03-11 13:34:42

  • 严晓鹏

    2022-03-30 09:14:27

    也就是说,通过合理使用 CDN,QuickTok 数据中心需要处理的带宽压力不到 4Tb。=>老师您好 这个4Tb的带宽 运营商可以提供么?
    作者回复

    网络带宽肯定要运营商提供

    2022-03-30 09:55:54

  • gesanri

    2022-03-23 22:05:04

    短视频的完播率通常不足 30%,所以 QuickTok 也不需要将完整视频推送到 CDN,只需要根据视频发布者的历史播放记录,计算其完播率和播放期望进度,然后将短视频切分成若干 chunk,将部分 chunk 推送到 CDN 即可
    这里有点没看懂,完播率从字面上理解就是点开这个视频的人有多少人完整看完了这个视频,比如十个人点开这个视频但是只有三个人看完了,完播率就是30%,那我理解就算100个人里面只有一个人完整的看完了这个视频,这个视频回源后还是会完整的存储在cdn上,那只将部分chunk推送到cdn的意义何在?是说99个人只看了一部分视频直接从cdn就能取到,而那个看完整视屏的人在视频前部分从cdn取,而视频后部分直接从hdfs取吗?这样节省cdn费用?
    作者回复

    CDN是一个跨地域的分布式缓存,所以不能说“一个视频完整存在CDN”,只能说“一个视频完整存在CDN的某个服务商的某个地方”,一个视频在有的地方CDN服务器上是完整的,有的地方一个chunk都没有,都是可能的。

    缓存就是将最可能被用户重复读取的数据缓存起来,至于效果如何,并不是必然保证的,也不是为了节省CDN。

    2022-03-28 10:32:28

  • 易企秀-郭彦超

    2022-03-01 10:26:57

    视频文件放在hdfs上 对于高并发访问支持不太好吧
    作者回复

    高并发文件访问的瓶颈是硬盘本身,跟HDFS其实关系不大。视频的高并发也是有热点的,主要靠CDN和其他缓存搞定。

    2022-03-01 14:41:52

  • Laputa

    2022-07-27 22:15:55

    如果只推部分chunk 到cdn,那客户端拉视频时也是以chuck 为单位拉喽?如果要播放的部分没有在cdn上,cdn会提前自动回源么?cdn会对视频类的文件有特殊处理么
  • 神经蛙

    2022-06-26 09:25:14

    其实YouTube这种点播视频网站也能用这个架构吧,除了储存空间要高一个量级
  • 风行

    2022-05-14 21:02:18

    老师你好,我想请问下,在部署架构图中,视频上传和访问的所有请求都需要经过网关,面对高并发的场景,是否网关本身就存在瓶颈,是否需要根据不同的业务分类来部署多个网关系统?
    作者回复

    网关可以根据业务分类部署,不过这么做的目的主要还是为了业务解耦,便于系统维护。

    对于高并发场景,网关只需要进行伸缩,扩大集群规模就可以了,不会成为瓶颈。

    2022-05-16 14:33:22

  • javaadu

    2022-03-24 08:53:05

    内容处理器需要产出视频标签🏷️,用户搜索视频的时候需要根据用户的画像和视频的标签做推荐和匹配,另外用户的点击习惯和阅读习惯可以记录下来给用户标签系统使用,以及给内容处理器系统使用