暴走环球趣闻网

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

  • 日期:2020-09-16 13:48:26
  • 来源:互联网
  • 编辑:小狐
  • 阅读人数:597

简介:对于负责建设处理的技术团队而言,这样的业务场景就留给了他们一系列的。

前言

处理需求分析

构建在线教育弹性高可用视频处理架构实战(图1)

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

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

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

4将处理好的文件保存回对象存储,并同步到CDN进行加速。

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

2如何让每一个上传的尽可能快的处理完?

3如何尽可能的降低资源成本?

4如何高效率的应对需求的频繁变更?

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

使用SaaS化的云服务完成处理

随着各大云计算厂商产品线的不断丰富,我们可以很轻松的寻找到开箱即用的方案来解决这类典型的处理需求。以阿里云为例,点播类产品了采集、上传、媒体资源、转码处理、审核分析、分发加速于一体的一站式解决方案。

构建在线教育弹性高可用视频处理架构实战(图2)

对于技术团队而言,采用这样的方案不用预先准备任何计算资源,甚至不用编写任何代码,就能够从无到有拥有一整套处理,完全不用考虑资源规划的问题。这样的方案非常适合在业务发展初级需要让快速上线的场景。

但随着业务的不断发展,开箱即用的SaaS化方案还是存在不少的局限性,基于如下的原因,大多数的技术团队还是会选择自己建设处理:

1对于之前已经通过FFmpeg技术实现的处理服务,因为涉及到复杂的业务逻辑,很难直接迁移到SaaS化方案上来。

2高阶的处理需求必须使用代码来实现:比如音频降噪、插入动态Gif水印、按固定频率截帧等等。

3使用高分辨率的大是行业趋势,对于超大的处理,比如10G以上的1080P,往往需要通过自定义的手段进行计算优化,才能保证处理的及时性。

4在很多种场景下,自建处理都会带来明显的成本优势。

5频繁的业务需求变更需要对整套进行更精细粒度的迭代,比如采用金丝雀策略降低新版本发布所带来的风险。

那么如何建设一套同时具备高性能、高可用性、高灵活性、低成本特点的处理呢?

基于分布式集群

最典型的方案是申请一组云虚拟机,在每台虚拟机上部署处理应用,组建成一个可以水平伸缩的服务集服。当有新的上频上传的时候,可以触发一个处理任务,并通过负载均衡或队列对任务进行分发,接到任务的应用节点负责完成对应的任务。

构建在线教育弹性高可用视频处理架构实战(图3)

通过这个架构,在业务高峰期,用户上传行为比较密集,可以增加服务集群的实例数量,来提升处理能力。在业务低峰期,可以减少服务集群的实例数量,来减少资源成本。

此方案可以通过定制化的代码逻辑实现各种高阶的处理需求,灵活度非常高,配合可以水平伸缩的计算集群以及负载均衡机制,能同时满足性能和成本方面的需求,是一套被广泛采纳的方案。但在生产环境大规模运行的情况下,这套方案还是会暴露出很多问题:

1维护工作量大。

整套的维护工作量涵盖了虚拟机、网络、负载均衡组件、操作、应用等多个层面,需要投入大量的时间和精力来保障的高可用性与稳定性。举一个最简单的例子,当某个应用实例出现故障的时候,如何第一时间定位故障并尽可能迅速的将其从计算集群中摘除,摘除之后又如何保证之前没有完成的任务能够重新得到处理呢?这些都需要再配合完整的监控机制、故障隔离恢复机制来实现,甚至涉及到代码层的业务逻辑优化。

2弹性伸缩能力滞后。

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

3资源利用率低。

滞后的弹性伸缩能力会导致伸缩策略制定的相对保守,造成计算资源的大量浪费,增加了使用成本,如下图所示:

构建在线教育弹性高可用视频处理架构实战(图4)

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

函数计算

阿里云函数计算是事件驱动的全托管计算服务。通过函数计算,者无需等基础设施,只需编写代码并上传。函数计算会为自动准备好计算资源,以弹性、可靠的方式运行代码,并日志查询、性能监控、报警等功能,确保的稳定运行。

相比传统的应用保持运行状态并对外服务的方式,函数计算最大的区别是按需拉起计算资源对任务进行处理,在任务完成以后自动的回收计算资源,这是一种真正符合Serverless理念的方案,能最大化的提升资源利用率,减少维护工作量和使用成本。因为不需要预先申请计算资源,使用者完全不需要考虑容量评估和弹性伸缩的问题,只需要根据资源的实际使用量来进行付费。

构建在线教育弹性高可用视频处理架构实战(图5)

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

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

通过函数计算进行处理

基于函数计算的特性,搭建一套处理就非常简单,只需要配置一个OSS触发器,并将处理的核心代码上传到函数计算,就大功告成:

构建在线教育弹性高可用视频处理架构实战(图6)

通过这套方案,使用者不再需要考虑资源、负载均衡、高可用、弹性伸缩、监控等一系列复杂的问题,函数计算平台会按最优的方式根据用户的上传行为调度计算资源,低成本高效率的完成处理任务。具体的操作步骤和代码实现可以参考处理Python实现Demo,在这个Demo中,演示了如何基于函数计算将用户上传的统一转为640 * 480分辨率的mp4格式。

代码

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

def handler( context)

return “hello world”

当有事件触发的时候,就会从入口函数开始执行,其中参数携带了事件源相关的信息,比如在处理场景中,参数携带了上传到OSS的Bucket以及文件名等信息。而context参数携带了函数的运行信息,包括函数名、超时时间、访问凭证等。通过这些信息,就能让执行代码完成预定义的各种操作。

像Java这样的语言,在虚拟机启动的时候需要加载比较多的类库,不能够像实现运算实例毫秒级启动并进入执行状态,不能直接使用在一些对于延迟特别敏感的业务场景。但配合函数计算的预留实例以及单实例多并发新功能,能够消除冷启动对业务的影响,并降低等待下游服务响应的影响,让函数计算上运行的Java语言也能实现API网关等对延时要求特别高业务场景。请参考预留实例和单实例多并发。

Serverless工作流

通过前面介绍的方案,可以轻松完成对短的各种定制化处理。但每一个函数计算实例,在资源规格上和总运行时长都不是无限的,目前函数计算实例可以拥有3G的内存资源和10分钟的执行时间,这也就说明,当一个处理任务需要占用3G以上的内存,或者总执行时长超过10分钟的情况下,处理任务是会失败的。

在5G时代,超大课件是非常普遍的需求,如何通过函数计算处理这样的大呢?这个时候就要出动另一个武器---Serverless工作流,来配合函数计算一起完成这个任务。

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

构建在线教育弹性高可用视频处理架构实战(图7)

您可以使用 Serverless 工作流编排一系列的函数资源,同时定义流程中每一步的输入和输出,使用内置控制步骤编排复杂逻辑、发起并行执行、超时或终止流程。另外通过控制台能够使用图形界面显示出执行任务状态和执行顺序,同时控制台会显示每个步骤的实时状态,并每次执行的详细历史记录。通过Serverless工作流 + 函数计算的组合,我们可以突破时间和空间的限制,对任意大小的文件进行复杂的处理。

大处理

简单来讲,处理一个大的基本思路是:

1将先进行切片处理,把每一个分片的大小控制在合理的大小,以便单个函数计算实例可以对其进行快速处理。

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

3对处理结果进行合并。

通过Serverless工作流 + 函数计算进行处理的流程如下:

构建在线教育弹性高可用视频处理架构实战(图8)

通过Serverless工作流的可视界面,我们能在工作流执行的过程当中,方便的查看到每一个步骤运行的信息,并配合自定义的Dashboard实现对整套处理的全面监控:

构建在线教育弹性高可用视频处理架构实战(图9)

构建在线教育弹性高可用视频处理架构实战(图10)

总结

基于函数计算和Serverless工作流的弹性高可用处理架构,充分体现了云原生时代Serverless化思想,以事件驱动的形式触发函数执行,真实计算资源真正意义上的按需使用。

对于使用而言,这套方案在保证业务灵活度的同时,可以显著降低维护成本与资源成本,并大幅度的缩短项目交付时间。

中间件小哥

本文相关词条概念解析:

函数

函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。

网友评论

提交评论

网站申明:本站图片仅为设计美化,与文章无关。如认为影响您的权益,请与我们联系。