乐趣区

关于javascript:构建在线教育弹性高可用视频处理架构实战

简介: 对于负责建设视频解决零碎的技术团队而言,这样的业务场景就留给了他们一系列的挑战。

前言

近些年,在线教育行业飞速发展,为整个社会的常识流传提供了前所未有的便利性。通过多种形式的在线教育平台,学员与老师即便相隔万里也能够发展教学活动。借助丰盛的网络课件,学员还能够随时随地的进行学习,真正突破了工夫和空间的限度。在各种模式的网络课件中,视频课件天然是最直观表现力最丰盛的模式,因而视频课件的市场占有率也在逐年晋升。

视频解决需要剖析

对于在线教育畛域的视频课件出品方而言,每天都要对大量视频内容进行解决,下图展现了一个比拟典型的场景:

(1)用户上传一个视频到平台后,会先在对象存储中对视频源文件进行暂存。

(2)平台对视频进行预处理,并打上水印。

(3)平台将视频文件转换为其余格局,并对分辨率进行调整,以适配各种不同的终端设备的要求。

(4)将解决好的视频文件保留回对象存储,并同步到 CDN 进行减速。

尽管从流程上来讲,这个场景比较简单,但在技术上的挑战其实是十分大的。视频课件的原作者来自于在线教育平台的宽广用户,可能是平台负责内容输入的外部用户,也有可能是签约的老师,或者是平台认证过的分享型用户。用户上传视频的操作并没有固定的频率,往往集中在几个时间段,存在显著的波峰波谷。在业务高峰期,视频解决的需求量十分大,有的在线教育企业每天要实现数万个视频的转码工作。对于负责建设视频解决零碎的技术团队而言,这样的业务场景就留给了他们一系列的挑战:

(1)如何确保这套零碎在业务高峰期的高可用性?

(2)如何让每一个上传的视频尽可能快的解决完?

(3)如何尽可能的升高资源老本?

(4)如何高效率的应答需要的频繁变更?

基于这几个诉求,咱们联合云计算的特点,来剖析一下可行的解决方案。

应用 SaaS 化的云服务实现视频解决

随着各大云计算厂商产品线的不断丰富,咱们能够很轻松的寻找到开箱即用的计划来解决这类典型的视频解决需要。以阿里云为例,视频点播类产品提供了视频采集、编辑、上传、媒体资源管理、转码解决、视频审核剖析、散发减速于一体的一站式解决方案。

对于技术团队而言,采纳这样的计划不必事后筹备任何计算资源,甚至不必编写任何代码,就可能从无到有领有一整套视频解决零碎,齐全不必思考资源布局的问题。这样的计划非常适合在业务倒退高级须要让零碎疾速上线的场景。

但随着业务的一直倒退,开箱即用的 SaaS 化计划还是存在不少的局限性,基于如下的起因,大多数的技术团队还是会抉择本人建设视频解决零碎:

(1)对于之前曾经通过 FFmpeg 技术实现的视频解决服务,因为波及到简单的业务逻辑,很难间接迁徙到 SaaS 化计划上来。

(2)高阶的视频解决需要必须应用代码来实现:比方音频降噪、插入动静 Gif 水印、按固定频率截帧等等。

(3)应用高分辨率的大视频是行业趋势,对于超大视频的解决,比方 10G 以上的 1080P 视频,往往须要通过自定义的伎俩进行计算优化,能力保障解决的及时性。

(4)在很多种场景下,自建视频解决零碎都会带来显著的老本劣势。

(5)频繁的业务需要变更须要对整套零碎进行更精密粒度的迭代治理,比方采纳金丝雀策略升高新版本公布所带来的危险。

那么如何建设一套同时具备高性能、高可用性、高灵活性、低成本特点的视频解决零碎呢?

基于分布式集群

最典型的计划是申请一组云虚拟机,在每台虚拟机上部署视频解决利用,组建成一个能够程度伸缩的服务集服。当有新的上频上传的时候,能够触发一个解决工作,并通过负载平衡或音讯队列对工作进行散发,接到工作的利用节点负责实现对应的工作。

通过这个架构,在业务高峰期,用户上传视频行为比拟密集,能够减少服务集群的实例数量,来晋升解决能力。在业务低峰期,能够缩小服务集群的实例数量,来缩小资源老本。

此计划能够通过定制化的代码逻辑实现各种高阶的视频解决需要,灵便度十分高,配合能够程度伸缩的计算集群以及负载平衡机制,能同时满足性能和老本方面的需要,是一套被宽泛驳回的计划。但在生产环境大规模运行的状况下,这套计划还是会暴露出很多问题:

(1)保护工作量大。

整套零碎的保护工作量涵盖了虚拟机、网络、负载平衡组件、操作系统、利用等多个层面,须要投入大量的工夫和精力来保障系统的高可用性与稳定性。举一个最简略的例子,当某个利用实例呈现故障的时候,如何第一工夫定位故障并尽可能迅速的将其从计算集群中摘除,摘除之后又如何保障之前没有实现的工作可能重新得到解决呢?这些都须要再配合残缺的监控机制、故障隔离复原机制来实现,甚至波及到代码层的业务逻辑优化。

(2)弹性伸缩能力滞后。

有两种形式实现计算集群的弹性伸缩:通过定时工作触发,或者通过指标阈值(CPU 利用率,内存使用率等)触发。不论采纳哪种形式,都没有方法基于用户行为精细化治理,在遇到工作密度大幅度起伏的时候,会面临弹性伸缩能力滞后的问题。当来自用户的视频上传申请突增的时候,新增一个利用实例须要通过申请云资源 > 初始化 > 部署利用镜像 > 利用启动 > 退出负载平衡列表等多个阶段,即使通过 Kubernetes+ 预留资源池等技术优化,也往往须要 10 分钟以上。

(3)资源利用率低。

滞后的弹性伸缩能力会导致伸缩策略制订的绝对激进,造成计算资源的大量节约,减少了应用老本,如下图所示:

有没有一种计划能能帮忙技术团队专一于业务逻辑的实现,并能够依据用户的实际上传申请进行精细化的资源分配,实现资源利用最大化呢?随着云计算的飞速发展,各大云厂商都在积极探索新的计划,用更加“云原生”的形式来解决老本和效率的问题,阿里云提供的函数计算 + Serverless 工作流就是这个畛域十分具备代表性的计划。

函数计算

阿里云函数计算是事件驱动的全托管计算服务。通过函数计算,开发者无需治理服务器等基础设施,只需编写代码并上传。函数计算会为主动筹备好计算资源,以弹性、牢靠的形式运行代码,并提供日志查问、性能监控、报警等性能,确保零碎的稳固运行。

相比传统的应用服务器放弃运行状态并对外提供服务的形式,函数计算最大的区别是按需拉起计算资源对工作进行解决,在工作实现当前主动的回收计算资源,这是一种真正合乎 Serverless 理念的计划,能最大化的晋升资源利用率,缩小零碎系统维护工作量和应用老本。因为不须要事后申请计算资源,使用者齐全不须要思考容量评估和弹性伸缩的问题,只须要依据资源的理论使用量来进行付费。

下图展现了函数计算的工作形式:

对于使用者而言,把实现要害业务逻辑的代码上传到函数计算平台,就能以事件驱动的形式触发函数执行。函数计算曾经反对各种支流的编程语言,对于即有的代码,能够通过几个非常简单的步骤部署到函数计算。函数反对的所有开发语言请参考开发语言列表。

每一次计算资源的调配,都基于事件的触发,一个事件往往对应着业务上的一个工作。函数计算反对多种多样的触发器,比方 HTTP 触发器的事件源就是 HTTP 申请,函数计算接管到一次 HTTP 申请后,会依照预设的规格,调配相应的计算资源来解决这个 HTTP 申请,申请解决实现之后,函数计算会依据用户的设置决定是否立刻回收这一次拉起的计算资源。而 OSS 触发器,可能监控产生在对象存储 OSS 上的各种事件,当有用户上传新文件或者对文件进行批改的时候,主动触发函数执行,这种形式就刚好适宜视频解决的业务场景。更多反对的函数触发器请参考触发器列表。

在计算资源的调度上,函数计算进行了大量优化,面对用户申请的突增,能够在毫秒级拉起大量的计算资源来并行工作,确保用户体验。

通过函数计算进行视频解决

基于函数计算的个性,搭建一套视频解决零碎就非常简单,只须要配置一个 OSS 触发器,并将视频解决的外围代码上传到函数计算,就功败垂成:

通过这套计划,使用者不再须要思考资源管理、负载平衡、零碎高可用、弹性伸缩、系统监控等一系列简单的问题,函数计算平台会按最优的形式依据用户的上传行为调度计算资源,低成本高效率的实现视频解决工作。具体的操作步骤和代码实现能够参考视频解决 Python 实现 Demo,在这个 Demo 中,演示了如何基于函数计算将用户上传的视频对立转为 640 * 480 分辨率的 mp4 格局视频。

代码开发

每一个创立好的函数都会对应一个指定的入口,函数计算会从这个函数入口开始执行,相似于本地开发中的 Main()函数。以 Python 语言为列,一个简略的入口函数如下:

def handler(event, context):
    return 'hello world'

当有事件触发的时候,就会从入口函数开始执行,其中 event 参数携带了事件源相干的信息,比方在视频解决场景中,event 参数携带了上传到 OSS 的 Bucket 以及文件名等信息。而 context 参数携带了函数的运行信息,包含函数名、超时工夫、拜访凭证等。通过这些信息,就能让执行代码实现预约义的各种操作。

函数计算反对各种支流的编程语言,在这个编程语言当中,Node.js 和 Python 等脚本型语言含了丰盛的类库,开发效率很高,而且运算实例启动的速度很快,可能反对对提早特地敏感的工作,是函数计算最匹配的语言。Java 和 Go 等语言不能像脚本型语言一样间接上传代码就能创立一个函数,须要事后进行编译,应用起来会略微简单一些,但配合函数计算提供的 Funcraft 等工具,也能够大幅度晋升开发和部署的效率。不论应用哪种开发语言,都倡议使用者下载官网提供的 Funcraft 工具,更轻松进行开发、构建、部署操作,请参考 Funcraft。

像 Java 这样的语言,在虚拟机启动的时候须要加载比拟多的类库,不可能像实现运算实例毫秒级启动并进入执行状态,不能间接应用在一些对于提早特地敏感的业务场景。但配合函数计算提供的预留实例以及单实例多并发新性能,可能打消冷启动对业务的影响,并升高期待上游服务响应的影响,让函数计算上运行的 Java 语言也能实现 API 网关等对延时要求特地高业务场景。请参考预留实例和单实例多并发。

Serverless 工作流

通过后面介绍的计划,能够轻松实现对短视频的各种定制化解决。但每一个函数计算实例,在资源规格上和总运行时长都不是有限的,目前函数计算实例能够领有 3G 的内存资源和 10 分钟的执行工夫,这也就阐明,当一个视频解决工作须要占用 3G 以上的零碎内存,或者总执行时长超过 10 分钟的状况下,解决工作是会失败的。

在 5G 时代,超大视频课件是十分广泛的需要,如何通过函数计算解决这样的大视频呢?这个时候就要出动另一个武器 —Serverless 工作流,来配合函数计算一起实现这个工作。

Serverless 工作流是一个用来协调多个分布式工作执行的全托管云服务。您能够用程序、抉择、并行等形式来编排分布式工作,Serverless 工作流会依照设定好的步骤牢靠地协调工作执行,跟踪每个步骤的状态转换,并在必要时执行用户定义的重试逻辑,以确保工作流顺利完成。Serverless 工作流通过提供日志记录和审计来监督工作流的执行,不便您轻松地诊断和调试利用。

您能够应用 Serverless 工作流编排一系列的函数资源,同时定义流程中每一步的输出和输入,应用内置管制步骤编排简单逻辑、发动并行执行、治理超时或终止流程。另外通过控制台可能应用图形界面显示出执行工作状态和执行程序,同时控制台会显示每个步骤的实时状态,并提供每次执行的具体历史记录。通过 Serverless 工作流 + 函数计算的组合,咱们能够冲破工夫和空间的限度,对任意大小的视频文件进行简单的解决。

大视频解决

简略来讲,解决一个大视频的基本思路是:

(1)将视频先进行切片解决,把每一个分片的大小管制在正当的大小,以便单个函数计算实例能够对其进行疾速解决。

(2)拉起多个函数计算实例对每一个分片进行并行处理。

(3)对处理结果进行合并。

通过 Serverless 工作流 + 函数计算进行视频解决的流程如下:

通过 Serverless 工作流提供的可视界面,咱们能在工作流执行的过程当中,不便的查看到每一个步骤运行的信息,并配合自定义的 Dashboard 实现对整套视频解决零碎的全面监控:

升高保护老本与资源老本,并大幅度的缩短我的项目交付工夫。

在线教育畛域对于视频解决的需求量十分大,而且对于处理速度、并发吞吐量、资源利用率等方面都有极高的要求,函数计算 + Serverless 工作流计划组合帮忙用户轻松建设弹性高可用的视频解决架构,是实现这些简单需要的最优解。随着云原生的一直倒退,Serverless 相干技术还将深刻更多的业务场景,有将来有有限可能!

原文链接
本文为阿里云原创内容,未经容许不得转载。

退出移动版