短视频流媒体平台的系统设计

1. 功能需求:

我们的系统有两类参与者

内容创作者

•上传任何类型的视频(格式+编解码器)•视频可以被删除•视频元数据•必填项: 标题,作者,描述•选填项: 分类/标签列表•可以随时更新•当视频对观众可用时,向内容创作者发送电子邮件

不在讨论范围内:

•直播•视频修改•支付和订阅

用户/观众

•需要注册+订阅•使用自由文本搜索视频属性/元数据•在以下设备上观看视频•任何设备(移动设备,平板电脑,桌面电脑)•使用网络浏览器/专用应用•在不同的网络条件下

2. 非功能需求:

内容创作者

•可扩展性•1000名用户平均每周上传1个视频•视频可以达到60 FPS,时长数小时,高分辨率且未压缩•视频大小约50 GB(>50 TB/周)•可用性(低停机时间)•99.9%的正常运行时间•性能•响应时间在99pt时< 500 ms•视频在几小时内对用户可用•数据一致性(CAP)•在我们的案例中,对于内容创作者:一致性 (CP) > 可用性 (AP)

用户/观众

•可扩展性•数亿每日用户•可用性•99.9%的正常运行时间•性能•响应时间在99pt时< 500 ms•无论用户的设备大小和网络如何,播放时都无缓冲时间•数据一致性(CAP)•在这种情况下,可用性 (AP) > 一致性 (CP)

3. 视频传输流程理解:

d4aef431a3c9a18feeb75d5f863ee484.png

1*wxdVdbXya9eoyEjjTlEJSw.png

点播视频传输图:

视频编解码器: H.264 / AVC, H.265 / HEVC, VP9, AV1

音频编解码器: AAC, WAV, MP3, WMA

向终端用户传输压缩视频 我们如何为个别用户决定比特率?根据设备决定比特率 风险:

•高估用户的带宽•低估用户的带宽

如果我们只考虑设备,可能会有很多网络变化,最好的方法是考虑网络条件。这种技术称为自适应比特率 (ABR)。在这种技术中,我们基本上将不同比特率的转码视频流分解成通常为5-10秒的片段,并在清单文件中引用它们,所以当用户开始播放视频时,它首先下载清单文件并缓冲前3个片段,之后它会重新评估带宽,从更高或更低比特率的版本中选择片段。如果您想了解更多关于ABR的信息,请点击这里

最后一步是我们的转码视频作为包被提供,不同的浏览器,应用遵循不同的协议和交付格式,所以我们必须将我们的视频打包成每一种协议,并且我们必须使用DRM(数字版权管理)来保护我们的视频。

4. 符合内容创作者和用户功能需求的系统架构图:

以下图表符合我们所有的功能需求。

e26baab47ab8acb3fc990d0b5137e50c.png

5. 符合非功能需求的系统架构图:

现在是时候让我们的应用程序可扩展,以满足非功能需求了。

内容创作者:

可扩展性

•由于上传视频的频率并不很高,所以我们可以在我们的Web应用和视频数据服务前面放置负载均衡器,并运行每个服务的几个实例。•相反,每个视频的体积非常大,所以我们需要识别我们流程中的瓶颈,因此之前我们的视频文件首先被发送到API网关,然后是web应用,最终web应用将文件存储到我们的对象存储中,但是我们可以使用签名URL,因为我们在API和web应用服务上浪费了大量的网络和计算能力。签名URL将允许直接访问对象存储的时间和权限有限的访问。

可用性

•通过在我们的服务中使用冗余,我们已经提供了高可用性,此外,通过使用云托管的对象存储进行转码和打包服务,我们可以直接获得可用性。对于最后一步,我们需要在NoSql数据库上进行复制,以便视频服务。

性能

•如果我们的所有内容创作者都想在同一天或同一时间上传视频怎么办?我们可能无法在合理的时间内处理它们。为了确保成功,我们需要在视频处理管道中提供足够的并行性。

数据一致性

•为了随时更新元数据,我们需要选择视频服务数据库的DB技术或配置,以提供一致性(CP)在分区容错上优先于可用性(AP)。

以上所有内容,我们现在已经完成了内容创作者的所有非功能需求。

用户/观众:

可扩展性

•为了满足数百万用户的请求,我们需要将搜索服务放在负载均衡器后面,并将其作为一组相同的实例运行,然后复制搜索数据库,以便我们可以支持新请求并将它们分散到多个数据库实例中。

可用性

•关于高可用性,我们已经基本上覆盖了,我们需要做的唯一事情是在多个隔离区域地理位置运行我们的系统,例如美国西部,美国东部,亚太地区,欧洲。

性能

•解决性能问题的最重要组件是添加CDN。此外,我们不会更新视频数据服务与对象存储中的视频位置,而是将CDN url添加到视频服务数据库。所以现在当用户通过API请求视频URL时,它将提供指向CDN的url,并且它将从最近的边缘服务器将内容提取到用户的设备,这将导致视频的前两个片段更快地到达用户,之后自适应比特率流媒体将启动,并将缓冲时间减少到几乎为零。

数据一致性

•搜索服务使用CQRS(事件驱动)模式从视频数据服务获取数据,这已经保证了最终一致性,所以我们只需要配置搜索数据库,优先考虑可用性(AP)而不是一致性(CP)。

a432ae2919de54047b2ed37ef7e3d192.png
1*ajrOQlpjb-jv-AHDLre7DQ.png

通过以上所有内容,我们成功完成了所有非功能需求,打造了一个高度可扩展的视频流媒体平台

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

怎么把相机储存卡里的照片导出来?介绍两种方法

随着摄影技术的不断发展和普及&#xff0c;相机已成为我们记录生活、捕捉美好瞬间的设备。然而&#xff0c;对于许多摄影爱好者来说&#xff0c;如何将相机储存卡里的照片安全、高效地导出到电脑或其他设备中&#xff0c;却成为了一个令人头疼的问题。本文将为您详细介绍从相机…

17.C++常用的算法_集合算法

文章目录 遍历算法1. set_intersection()代码工程运行结果 2. set_union()代码工程运行结果 3. set_difference()代码工程运行结果 遍历算法 1. set_intersection() 代码工程 /*1.求交集的两个集合必须是有序序列*/ /*2.目标容器开辟空间需要从两个容器中取较小值*/ /*3.set…

小程序中使用HTTPS调用自带文本安全内容检测接口(msg_sec_check)的实现方法

在小程序中调用自带的文本安全内容检测接口&#xff0c;你需要使用小程序提供的wx.request方法。以下是一个示例代码&#xff1a; javascript代码: // 假设你已经获取了access_token,如果不知道如何获取&#xff0c;可以参考我上一篇文章 const access_token 你的access_tok…

【结构型模式】外观模式

​一、外观模式概述 外观模式定义与意图&#xff1a;外观类为复杂的子系统提供了一个统一的入口。外观模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。&#xff08;对象结构型模式&#xff09; 外观模式的特点&#xff1a; 1.又叫做门面模式&#xf…

电磁炉原理笔记

电磁炉加热原理 【电磁炉工作原理&#xff0c;电涡流感应加热原理】 https://www.bilibili.com/video/BV11M411M7Wt/?share_sourcecopy_web&vd_source44c5c5fe44538189ece80f09460cf625 我是看的这个科普视频&#xff1b; 总结一下就是下图&#xff1a; 线圈的磁场影响…

链表判环问题

1、为什么slow走一步&#xff0c;fast走两步&#xff0c;会不会错过&#xff1f;请证明。 假设slow进环的时候fast和slow之间的距离时N&#xff0c;slow进环以后&#xff0c;fast开始追击slow每走一步&#xff0c;fast走2步&#xff0c;他们之间的距离缩小1. fast和slow之间的…

“三步走”带你拿下C++类与对象(下)

在学习了“上”篇和“中”篇后&#xff0c;我们对类和对象以及一些析构函数有了一定的理解&#xff0c;本文我们将继续深入讲解有关的其他内容。 一、初始化列表的引入 我们以之前的队列为例子&#xff08;创建两个队列一个用于入栈一个用于出栈&#xff09; 这个myqueue对内…

全志R329 AP6256 蓝牙调试

1、在全志r329平台移植AP6256,移植了一个星期,记录下过程。 2、本来产品只需要wifi,不需要蓝牙的。但是我们使用的是正基AP6256的wifi、BT二合一的模组。 该模块只要有BT功能就需要做BT的3C认证。 好吧。 1、获取调试蓝牙的几个工具 两个方法: 1.1、方法一:自己交叉…

蓝桥杯2024年第十五届省赛真题-爬山

贪心优先队列的题&#xff0c;贪心会漏一个情况&#xff0c;不知道怎么处理&#xff0c;这里直接打表了 2 1 1 48 49 答案是30&#xff0c;贪心是31 专有名词&#xff1a;hack-有新的测试点过不了 #include<bits/stdc.h> using namespace std; #define endl \n #define …

QT C++ sqlite 对多个数据库的操作

//本文描述&#xff0c;QT 对多数据库的操作。 //你可能会想&#xff0c;多数据库的操作时&#xff0c;查询语句怎么知道是哪个数据库。 //QT提供了这样一种构造函数 QSqlQuery(const QSqlDatabase &db) //指定数据库 //在QT6.2.4 MSVC2019调试通过。 //效果见下图&am…

HarmonyOs开发:导航tabs组件封装与使用

前言 主页的底部导航以及页面顶部的切换导航&#xff0c;无论哪个系统&#xff0c;哪个App&#xff0c;都是最常见的功能之一&#xff0c;虽然说在鸿蒙中有现成的组件tabs可以很快速的实现&#xff0c;但是在使用的时候&#xff0c;依然有几个潜在的问题存在&#xff0c;第一&a…

12. MyBatis(二)

源码位置&#xff1a;MyBatis_demo 上篇文章我们学习了MyBatis的定义以及增删查改操作&#xff0c;并且学习了如何在xml文件中编写SQL时使用#{}的方式将参数和对象的属性映射到SQL语句中&#xff0c;上篇的内容已经足以应对大部分场景&#xff0c;本篇文章我们就要学习一下MyBa…

测绘管理与法律法规 | 测绘资质管理办法 | 学习笔记

目录 一、测绘资质概述 二、测绘资质分类与等级 三、审批与管理 四、申请条件 五、审批程序 六、测绘资质证书 七、监督管理 八、违规处理 九、特殊规定 十、审批受理时间要点补充 1. 审批机关决定是否受理的时间 2. 审批机关作出批准与否的决定时间 3. 颁发测绘资…

linux /proc进程文件目录介绍

参考&#xff1a;https://zhuanlan.zhihu.com/p/619966043 有时候想只查出来进程号&#xff0c;可以通过/proc/下查出该进程的运行及执行脚本情况信息 /proc/pid子目录 记录了进程的相关信息cmdline文件&#xff1a;包含了进程启动时使用的完整命令行参数。 cwd符号链接&#x…

29. 【Android教程】折叠列表 ExpandableListView

本节学习一个可折叠的 ListView&#xff0c;可以用在一些需要分类的场景下。通过 ExpandableListView 我们可以首先在 ListView 上展示大的分类&#xff0c;当点击某个类别的时候再将 ListView 做一个展开&#xff0c;展示该类下的所有子类供用户选择。它与 ListView 的不同主要…

考研数学|武忠祥VS张宇,谁讲得更全面❓

张宇和武忠祥都是很好的老师&#xff0c;你肯定也是这么觉得的&#xff0c;你自己也说了&#xff0c;跟着张宇看了几章&#xff0c;感觉不错&#xff0c;那就继续跟着啊&#xff0c;为什么听到同学说武忠祥好&#xff0c;你就动摇了呢。我们对于任何事情都要有自己的思考和规划…

SQL注入简单总结

一、SQL注入是什么 SQL注入即&#xff1a;是指web应用程序对用户输入数据的合法性没有判断或过滤不严&#xff0c;攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句&#xff0c;在管理员不知情的情况下实现非法操作&#xff0c;以此来实现欺骗数据库服…

prompt问题【中间不好】

问题1:longchain 关键词在中间容易被忽略掉 Found in the Middle: How Language Models Use Long Contexts Better via Plug-and-Play Positional Encoding 论文对大模型在长文本情况下的性能做了一系列实验研究&#xff0c;发现了一个有趣的“Lost in the middle”现象&#x…

我与C++的爱恋:隐式类型转换

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 朋友们大家好&#xff0c;本篇内容我们来介绍初始化列表&#xff0c;隐式类型转换以及explicit的内容 一、初始化列表 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器…

【笔试强训】Day3 --- 简写单词 + dd爱框框 + 除2!

文章目录 1. 简写单词2. dd爱框框3. 除2&#xff01; 1. 简写单词 【链接】&#xff1a;简写单词 解题思路&#xff1a;简单模拟题&#xff0c;主要是处理⼀下输⼊的问题。&#xff08;也可以利用string类中的find函数&#xff0c;但时间复杂度会偏高&#xff09; #include …