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

Java全能学习+面试指南:https://javaxiaobear.cn

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

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

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

看 QuickTok 的需求与技术架构。

1、需求分析

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

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

10亿 × 10 = 100亿

平均播放 QPS 为 11 万 / 秒:

100亿 ÷ (24 × 60 × 60) ≈ 11万/秒

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

11万/秒 × 5 × 60秒 = 3千万

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

11万/秒 ÷ 200 = 550/秒

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

100MB × 550 = 55GB

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

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

55GB × 60 × 60 × 24 × 365 = 1700PB

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

1700PB × 3 = 5200PB

而播放视频需要的总带宽:
11万 × 100MB × 8bit = 88Tb

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

务。

2、概要设计

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

image-20231205162651105

用户上传视频时,上传请求会通过负载均衡服务器和网关服务器,到达视频上传微服务。

视频上传微服务需要做两件事:一是把上传文件数据流写入视频文件暂存服务器;二是把用户名、上传时间、视频时长、视频标题等视频元数据写入分布式 MySQL 数据库。

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

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

image-20231205162811469

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

image-20231205162859524

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

image-20231205162945139

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

缩略图展现给用户,使用户对视频内容有个初步而直观的感受。

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

3、详细设计

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

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

1、视频存储系统设计

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

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

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

image-20231205163715592

举个例子,当用户上传一个视频文件,系统会自动生成一个视频 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 完整的文件数据了。

2、性能优化与 CDN 设计

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

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

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

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

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

image-20231205164005723

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

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

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

3、缩略图生成与推荐设计

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

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

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

image-20231205164239702

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

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

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

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

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

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

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

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

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

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

4、总结

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

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

地图服务 ArcGIS API for JavaScript基础用法全解析

地图服务 ArcGIS API for JavaScript基础用法全解析 前言 在接触ArcGIS之前&#xff0c;开发web在线地图时用过Leaflet来构建地图应用&#xff0c;作为一个轻量级的开源js库&#xff0c;在我使用下来Leaflet还有易懂易用的API文档&#xff0c;是个很不错的选择。在接触使用Ar…

简单地将附件POST到Notes应用中

大家好&#xff0c;才是真的好。 这半年我们会讲很多开发知识&#xff0c;这篇紧接上篇《通过URL将HTML表单数据创建到Domino应用中》&#xff0c;讲述如何将附件POST到Note应用中。 原理是一样&#xff0c;首先&#xff0c;你得有一个表单&#xff0c;我们用html写一个&…

Android 缩减、混淆处理和优化应用

为了尽可能减小应用的大小&#xff0c;您应在发布 build 中启用缩减功能来移除不使用的代码和资源。启用缩减功能后&#xff0c;您还会受益于两项功能&#xff0c;一项是混淆处理功能&#xff0c;该功能会缩短应用的类和成员的名称&#xff1b;另一项是优化功能&#xff0c;该功…

云HIS:新一代云架构医院信息管理系统源码(java语言)

云HIS信息管理云平台&#xff0c;提供全方位的临床系统应用&#xff0c;是国内领先的以云计算为基础&#xff0c;以云计算赋能医疗机构&#xff0c;是颠覆传统医疗信息化业态的技术与模式创新&#xff0c;以SaaS方式&#xff0c;为医疗机构提供信息系统服务&#xff0c;满足从医…

HashMap系列- key到i的转换

1.key转换成hash >>>表示无符号的右移&#xff1a;按照二进制把数字右移指定数位&#xff0c;高位直接补零&#xff0c;低位移除。 ^&#xff08;按位异或运算&#xff09;&#xff1a;运算规则&#xff1a;相同的二进制数位上&#xff0c;数字相同&#xff0c;结果…

Deep Learning(wu--84)调参、正则化、优化--改进深度神经网络

文章目录 2偏差和方差正则化梯度消失\爆炸权重初始化导数计算梯度检验OptimizationMini-Batch 梯度下降法指数加权平均偏差修正RMSpropAdam学习率衰减局部最优问题 调参BNsoftmax framework 2 偏差和方差 唔&#xff0c;这部分在机器学习里讲的更好点 训练集误差大&#xff…

基数排序简单了解

基数排序是根据数字每一位从低到高去进行分类排序的 比如对于数组[1, 11, 2, 12]&#xff0c;从个位数开始&#xff0c;1和11分到了桶1&#xff0c;2和12分到了桶二&#xff0c;接着十位数&#xff0c;1和2分到了一桶&#xff0c;但由于在上一次分桶中&#xff0c;2在1之后&am…

【生信分析】基因组学导论

由于工作需要&#xff0c;现在开始跨行学生信&#xff01; 祝我成功 目标&#xff1a;通过一周的学习能对对不同高通量测序数据集&#xff08;RNA-seq、ChIP-seq、BS-seq 和多组学集成&#xff09;进行分析。 配置环境 if (!requireNamespace("BiocManager", quiet…

详解ES6中的symbol

ES6 引入了一种新的原始数据类型 Symbol&#xff0c;表示独一无二的值。 Symbol的值是唯一的&#xff0c; 用来解决命名冲突的问题; 它是JavaScript 语言的第七种数据类型&#xff0c;是一 种类似于字符串的数据类型&#xff1b; 特点如下&#xff1a; 创建唯一值&#xff1…

二叉树的前、中和后序遍历的递归与迭代实现

1. 前序遍历 1.1 递归 /*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val (valundefined ? 0 : val)* this.left (leftundefined ? null : left)* this.right (rightundefined ? null : right)* }*/ /*** param …

Vue学习笔记-activated和deactivated生命周期

作用 路由组件所独有的2个生命周期 activated生命周期函数用于在路由组件每次由消失到出现时所调用的函数deactivated生命周期函数用于路由组件每次由出现到消失时&#xff08;无论是否缓存&#xff09;所调用的函数 案例 定义一个NewsVue组件&#xff0c;要求&#xff1a;…

PyTorch分布式overview

PyTorch分布式overview 文章目录 PyTorch分布式overviewtorch.nn.DataParallel分布式数据并行训练(DistributedDataParallel)接触DDP, 从这个例子开始分布式数据并行(DistributedDataParallel)基本用例(Basic Use Case)Setup 单机的模型并行最好的实践DataParallel和Distribute…

C语言能判断一个变量是int还是float吗?

C语言能判断一个变量是int还是float吗&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「C语言从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&…

C语言词法陷阱

目录 前言 1、理解函数声明 最简单的声明符 函数和指针类型 其它组合 typedef简化 2、运算符优先级 C语言运算符优先级表 补充内容 3、作为语句结束标志的分号 多写分号 漏写分号 分号与函数声明 4、switch语句 5、函数调用 6、“悬挂”else引发的问题 前言 …

初识消息队列

1、消息 消息&#xff08;Message&#xff09;是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 2、消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用间的通信方式&#…

学生档案管理系统研究

摘 要 学生档案管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生档案管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案&#xff0c;这种管理方式存在着许多缺点,如:效率低…

Ant Design正式推出企业级设计体系,抢先了解!

企业级产品设计体系AntDesign是蚂蚁集团体经过大量项目实践和总结&#xff0c;逐步打磨出的产品。随着这两年B端产品的逐渐白热化&#xff0c;越来越多的用户对更好的用户体验有了进一步的要求。 作为专门为国内生产研究团队量身定制的在线协作工具&#xff0c;设计师可以直接在…

Kubernetes(K8s)DashBoard的使用-11

DashBoard 之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实&#xff0c;为了提供更丰富的用户体验&#xff0c;kubernetes还开发了一个基于web的用户界面&#xff08;Dashboard&#xff09;。用户可以使用Dashboard部署容器化的应用&#xff0c;还可以…

tomcat AJP文件包含漏洞(CVE-2020-1938)

漏洞介绍 CVE-2020-1938 是一个影响 Tomcat 的 AJP 文件包含漏洞。攻击者可以利用该漏洞通过 Tomcat AJP Connector 读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如配置文件或源码。 如果目标应用有文件上传功能,攻击者还可以利用文件包含漏洞实现远程代码执行,造成…