简介
本文我们将围绕工作流话题,介绍:
- 什么是工作流,适用哪些场景?
- 阿里云的全托管工作流服务:Serverless 工作流
- Serverless 工作流适用场景
- Serverless 工作流编排函数计算的最佳实践
维基百科对工作流的定义是:对工作流程及其各操作步骤之间业务规则的抽象、概括描述。我们认为工作流的主要职责是:
- 保证结果一致性,提高容错性要求:对错误重试,捕获,执行回滚或补偿逻辑
- 为长时间运行的流程维护持久化状态,保证任务调度可靠性
- 控制逻辑和任务逻辑解耦:细化责任,便于管理、维护和扩展
- 流程控制中心化、可视化:增强进度可观测性,简化来自不同背景人群的交流
- 模板方式定义控制逻辑和任务依赖:减少重复工作,统一流程描述标准
工作流通常适用于有状态的(stateful),异步 (async),长时间执行(long running)等特性的业务场景。其中比较典型的场景包括:
- 视频,音频,图片处理工作流
- 订单、审批流程
- 数据处理流水线
- 自动化运维
- 机器学习流水线、基因测序工作流
常见的开源工作流服务软件如
Apache Airflow,
Activiti Flowable Netflix Conductor等提供了使用代码,DSL 或是 BPMN 这类标准的工作流描述方式,允许开发者自己搭建工作流服务。不同云服务厂商也提供了各自的工作流服务如
AWS Step Functions,
AWS Simple Workflow Service Azure Durable Functions。那么阿里云有没有一个全托管的工作流服务呢?下面的文章将为您介绍阿里云 Serverless 工作流,其适用场景和最佳实践。
Serverless 工作流 (原函数工作流 FnF)
如下面的胶片所示,Serverless 工作流是一个专注于提供分布式任务编排的全托管 Serverless 阿里云服务。它不仅有完善的工作流功能,也提供了和阿里云多个云服务丰富的原生集成。开发者可以将任务编写成
函数计算的函数,构成完全 Serverless 的流程和任务,也可以将无法迁移到函数或者云上的任务继续在自己的 VPC 或是自建机房中运行,将编排和调度控制逻辑在云上执行。Serverless 的特性决定了工作流并行执行数可以弹性水平扩展,无需为工作流服务花费人力资源,仅按使用量付费,不为闲置资源付费。
场景 1 - 视频处理
视频处理场景通常涉及多个处理步骤如分片,合并,不同格式转码,不同的处理逻辑需要灵活低排列组合实现完成的视频处理业务,例如有些任务需要借助于函数计算或者 ECS 自建低成本转码,有些任务需要借助于阿里云媒体处理(MPS),点播 (VOD)实现敏感内容审核,CDN 刷新等。取决于原视频的时长,视频处理流程的时间通常也都以分钟,小时,甚至若干个小时为单位计算。这样长时间运行的业务需要可靠的状态维护,错误捕获和重试。视频处理通常在一天中有周期性的波峰波谷,或是突发的海量视频上传。Serverless 弹性伸缩和 Pay-as-you-go 的特性可以从视频处理吞吐量以及成本等角度更好地满足视频处理场景的需求。详细博客参考
轻松构建基于 Serverless 架构的弹性高可用音视频处理系统场景 2 - 数据处理流水线
离线大数据 ETL 流水线,海量 OSS 文件批量处理,超大 OSS 压缩包解压等场景通常有执行时间长,对弹性,成本要求高,对结果正确性有较严格要求,且有云服务事件触发或者定时触发的需求。Serverless 工作流最长可以支持执行时长 1 年的流程执行,Serverless 免运维,自动扩容缩容,自带错误重试(retry)和捕获(catch)机制。持久化的状态和消息保证数据处理流水线的最终一致性。通过 FC 的定时触发器也可以触发工作流的周期执行。详见博客
使用函数工作流+函数计算轻松构建 ETL 离线数据处理系统。
场景 3 - 订单、审批流程
电商订单,出游行程订单等涉及支付,库存预留等关键业务对于数据一致性有极强的要求。在分布式微服务的框架下,任何接口调用都有失败的风险。订单的工作流程设计需要充分考虑各个步骤可能的失败,后果和响应的补偿逻辑。例如在一个涉及多个分布式支付的流程中,如果第三步支付失败,工作流程需要自动将已经扣款的前两部取消并完成退款。Serverless 工作流的 try/catch,持久化状态维护等特点帮助开发者简化 SAGA 模式的开发,实现
分布式多步骤事务。审批流程有人工介入,审批网络不统一等场景特点,Serverless 工作流提供的任务分发至队列+回调功能可以帮助审批流程开发者轻松满足此类需求。
场景 4 - 自动化运维
生产环境的自动化运维工作流如 ECS 镜像,快照的构建,集群上下线机器需要可靠且灵活的逻辑描述能力。相比于描述依赖关系的 DAG (有向无环图)模型,Serverless 工作流提供了 FDL 这样更加强大和灵活的描述能力。定时触发,长时间执行,低成本和 100% 资源利用率也都是可以满足自动化运维场景中的常见需求。
场景 5 - 机器学习流水线
机器学习流水线设计算法开发,数据清洗,转化处理,模型训练,模型部署等多个步骤。生产环境中需要一个轻量的工作流引擎实现一个完整的 ML 反馈回路。Serverless Workflow 提供的人工介入能力,长时间执行和状态靠的特点可以很好地满足 ML 流水线。详见博客
生产中的 Serverless 机器学习流水线FC 函数编排最佳实践
这个段落我们将介绍函数计算(FC)异步任务编排的最佳实践。下图列出了 Serverless Workflow 结合 FC 的优势。
强化单个异步函数
需要澄清的是,工作流并非只适用于多个函数的编排,实际上任何一个需要状态观测(可查询),执行时间长,结果重要不允许消息丢失的场景,如下图的事件触发场景所示,即使整个逻辑只有一个 FC 函数,也推荐使用工作流强化,保证函数有足够的重试机会。另一个使用工作流来强化单函数的应用场景是使函数计算 HTTP 触发器能够支持异步调用,目前 FC HTTP 触发器仅限于同步调用。使用 HTTP FC 发起工作流(StartExecution)后即返回。使用另一个 HTTP FC 函数 (DescribeExecution) 达到了 HTTP 异步触发任务且可以使用 HTTP 查询的效果。
编排多个函数
下面的一系列图列举了编排多个函数常见的 4 种方式:
- 方式 1:单体函数(Monolith functions): 整个流程在同一个进程中运行
- 方式 2:函数编排(Function orchestration): 整个流程由一个编排函数同步调用多个任务函数完成
- 方式 3:事件触发点对点调用(Choreography):没有中心化的控制器,每个任务负责异步触发下一个任务
- 方式 4:Serverless 工作流编排(Workflow orchestration): 由中心化的工作流服务调度不同函数
下图是对于 4 种调用方式的对比分析。可以看到单体编排更适用于要求极低延迟,无状态 (stateless)的在线业务,逻辑相对简单,执行时间短的场景。FC 函数编排从维护上与微服务模型更加相似,更易于维护和多个团队协作,由于单函数的执行时间限制,同样不适用于长时间执行,也不适用于需要状态持久化 (stateful) 的流程。事件触发通过异步调用可以突破函数执行时长的限制,并且获得一定程度的状态持久化。然后持久化以及重试的程度并不能自定义,可观测性较低和开发成本偏高。对于长时间执行,需要状态维护,自定义重试等场景的关键流程,我们推荐用 Serverless 工作流的方式编排,获得最高的容错性,无限的执行时长,最优化的成本。
总结
本文我们简单介绍了工作流以及阿里云的工作流服务 Serverless Workflow。工作流适用于视频处理,数据处理流水线,订单、审批流程,自动化运维机器学习流水线等依赖工作流引擎的场景。使用工作流可以很好地补充完善单个 FC 异步函数的可靠性和可观测性。对于多个 FC 函数的编排,我们给出了 4 种不同的方法编排方式的最佳实践以及其对比分析,您可以根据实际场景选择编排方式。如果您的异步流程对正确性和持久化要求较高,执行时间较长 (分钟级别),关注异步任务的状态,我们推荐使用工作流编排 FC。如名字所示,全托管免运维,自动伸缩,100% 资源使用率,成本优化是 Serverless 解决方案的核心价值。
联系我们
如果您对工作流,函数计算,或者 Serverless 相关话题感兴趣欢迎加入我们的官网钉钉群交流、分享、讨论。