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


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

文章插图
 
通过这个架构 , 在业务高峰期 , 用户上传视频行为比较密集 , 可以增加服务集群的实例数量 , 来提升处理能力 。在业务低峰期 , 可以减少服务集群的实例数量 , 来减少资源成本 。
此方案可以通过定制化的代码逻辑实现各种高阶的视频处理需求 , 灵活度非常高 , 配合可以水平伸缩的计算集群以及负载均衡机制 , 能同时满足性能和成本方面的需求 , 是一套被广泛采纳的方案 。但在生产环境大规模运行的情况下 , 这套方案还是会暴露出很多问题:
(1)维护工作量大 。
整套系统的维护工作量涵盖了虚拟机、网络、负载均衡组件、操作系统、应用等多个层面 , 需要投入大量的时间和精力来保障系统的高可用性与稳定性 。举一个最简单的例子 , 当某个应用实例出现故障的时候 , 如何第一时间定位故障并尽可能迅速的将其从计算集群中摘除 , 摘除之后又如何保证之前没有完成的任务能够重新得到处理呢?这些都需要再配合完整的监控机制、故障隔离恢复机制来实现 , 甚至涉及到代码层的业务逻辑优化 。
(2)弹性伸缩能力滞后 。
有两种方式实现计算集群的弹性伸缩:通过定时任务触发 , 或者通过指标阈值(CPU利用率 , 内存使用率等)触发 。不管采用哪种方式 , 都没有办法基于用户行为精细化管理 , 在遇到任务密度大幅度起伏的时候 , 会面临弹性伸缩能力滞后的问题 。当来自用户的视频上传请求突增的时候 , 新增一个应用实例需要经过申请云资源>初始化>部署应用镜像>应用启动>加入负载均衡列表等多个阶段 , 即便通过Kubernetes+预留资源池等技术优化 , 也往往需要10分钟以上 。
(3)资源利用率低 。
滞后的弹性伸缩能力会导致伸缩策略制定的相对保守 , 造成计算资源的大量浪费 , 增加了使用成本 , 如下图所示:
构建在线教育弹性高可用视频处理架构实战

文章插图
 
有没有一种方案能能帮助技术团队专注于业务逻辑的实现 , 并可以根据用户的实际上传请求进行精细化的资源分配 , 实现资源利用最大化呢?随着云计算的飞速发展 , 各大云厂商都在积极探索新的方案 , 用更加“云原生”的方式来解决成本和效率的问题 , 阿里云提供的函数计算 + Serverless工作流就是这个领域非常具有代表性的方案 。
函数计算阿里云函数计算是事件驱动的全托管计算服务 。通过函数计算 , 开发者无需管理服务器等基础设施 , 只需编写代码并上传 。函数计算会为自动准备好计算资源 , 以弹性、可靠的方式运行代码 , 并提供日志查询、性能监控、报警等功能 , 确保系统的稳定运行 。
相比传统的应用服务器保持运行状态并对外提供服务的方式 , 函数计算最大的区别是按需拉起计算资源对任务进行处理 , 在任务完成以后自动的回收计算资源 , 这是一种真正符合Serverless理念的方案 , 能最大化的提升资源利用率 , 减少系统系统维护工作量和使用成本 。因为不需要预先申请计算资源 , 使用者完全不需要考虑容量评估和弹性伸缩的问题 , 只需要根据资源的实际使用量来进行付费 。
下图展示了函数计算的工作方式:
构建在线教育弹性高可用视频处理架构实战

文章插图
 
对于使用者而言 , 把实现关键业务逻辑的代码上传到函数计算平台 , 就能以事件驱动的方式触发函数执行 。函数计算已经支持各种主流的编程语言 , 对于即有的代码 , 可以通过几个非常简单的步骤部署到函数计算 。函数支持的所有开发语言请参考开发语言列表 。
每一次计算资源的分配 , 都基于事件的触发 , 一个事件往往对应着业务上的一个任务 。函数计算支持多种多样的触发器 , 比如HTTP触发器的事件源就是HTTP请求 , 函数计算接收到一次HTTP请求后 , 会按照预设的规格 , 分配相应的计算资源来处理这个HTTP请求 , 请求处理完成之后 , 函数计算会根据用户的设置决定是否立即回收这一次拉起的计算资源 。而OSS触发器 , 能够监控发生在对象存储OSS上的各种事件 , 当有用户上传新文件或者对文件进行修改的时候 , 自动触发函数执行 , 这种方式就刚好适合视频处理的业务场景 。更多支持的函数触发器请参考触发器列表 。


推荐阅读