本文介绍云工作流的流程定义语言,通过基础知识和相关使用示例,让您轻松熟悉构建和管理业务流程的技巧。
基础知识
云工作流的流程定义语言FDL(Flow Definition Language)是一种基于YAML语言的状态机定义规范,通过定义一个状态机(状态集合)描述业务流程逻辑;在执行时,按照流程定义的状态关系结合业务运行时执行结果驱动状态流转,最终完成流程执行。
一个流程(Flow)通常包含若干状态(State),这些状态可以是简单的原子状态,例如集成任务(Task)、成功(Succeed)、失败(Fail)、等待(Wait)和传递(Pass)等;也可以是复杂的控制状态,例如选择(Choice)、并行(Parallel)和循环(Map)等。这些状态可以组合嵌套使用,以构建复杂的业务逻辑,例如,一个并行状态的分支可以是一个选择状态。
流程中的状态执行可能出现错误,云工作流提供OnError错误处理能力,支持错误重试或错误流转到其他状态。
云工作流的状态类似于编程语言中的函数,组合类似于函数调用。状态之间通过输入(Input)和输出(Output)传递数据,每个状态由上下文(Context)变量保存数据。状态间可以组合嵌套,如果一个状态包含另一个状态,则称外层状态为内部状态的作用域(Scope)。
定义流程时,您可以使用以下状态:
任务(Task):用于调用其他集成服务API来完成特定任务。
传递(Pass):用于作为空白节点和数据预处理节点,在流程定义和调试阶段发挥作用。
等待(Wait):如果需要等待一段时间,可以通过等待(Wait)状态暂停流程的执行。
选择(Choice):用于根据特定的条件或逻辑判断来决定流程的下一步走向。
并行(Parallel):通过并行(Parallel)状态并行执行多个分支,这些分支共享同一份输入。
迭代(Map):允许用户对一个数组中的每个元素执行相同的操作,从而简化大规模数据的处理和工作流的管理。
成功(Succeed):用于提前结束一系列状态的执行,在需要根据特定条件提前结束流程或子流程时非常有用。
失败(Fail):用于处理工作流执行过程中出现的预期或非预期错误。
流程属性
流程包含以下属性。
字段 | 类型 | 是否必选 | 描述 | 示例值 |
Type | String | 是 | 流程定义类型。 | StateMachine |
SpecVersion | String | 是 | 流程定义的版本。 | v1 |
States | Array | 是 | 内部嵌套的状态数组,里面包含了流程的所有步骤,这些步骤可以嵌套使用,以控制工作流的执行路径。 |
|
StartAt | String | 是 | 内部嵌套状态数组的执行起点。 | my start task |
Name | String | 是 | 流程名称。 | my-wkfl |
Description | String | 否 | 流程描述。 | test workflow definition |
Timeout | Int | 否 | 执行超时时间。 | 600 |
状态通用属性
所有状态包含的通用属性。
字段 | 类型 | 是否必选 | 描述 | 示例值 |
Name | string | 是 | 状态名称。 | my-state-name |
Description | string | 否 | 状态描述。 | describe it here |
Type | string | 是 | 状态类型。 | Task |
Next | string | 否 | 当前状态的下一个状态。当End取值为true时,无需指定。 | my-next-state |
End | bool | 否 | 是否为当前作用域的终结节点。 | true |
YAML格式的同一个流程定义中,字段Name的值不能重复,包括代表流程名称的Name和代表状态名称的Name。
状态作用域
云工作流的状态(State)之间可以组合嵌套,作用域则是支撑复杂逻辑嵌套的基础。如果一个状态包含另一个状态,则称外层状态为作用域。如果两个状态为同级状态,则这两个状态的作用域相同。 我们将通过如下示例介绍流程的作用域概念:
Type: StateMachine
Name: my-wkfl
SpecVersion: v1
StartAt: Parallel1
States:
- Type: Parallel
Name: Parallel1
Next: Pass4
Branches:
- StartAt: Pass1
States:
- Type: Pass
Name: Pass1
Next: Pass2
OutputConstructor:
FieldA: 123
- Type: Pass
Name: Pass2
End: true
- StartAt: Pass2
States:
- Type: Pass
InputConstructor:
FieldA: 321
Name: Pass3
End: true
- Type: Pass
Name: Pass4
End: true
本示例中的作用域划分如下:
Parallel1与Pass4属于同一个作用域,即my-wkfl。
ParallelBranch #0与ParallelBranch #1属于同一个作用域,即Parallel1。
Pass1与Pass2属于同一个作用域,即ParallelBranch #0。
本示例与成功状态和失败状态示例类似,运行至End属性状态,会将自身所处的作用域状态标记为完成。具体信息如下:
Pass2完成后,ParallelBranch #0被标记为完成。
当某些时刻ParallelBranch #0和ParallelBranch #1陆续完成,Parallel1被标记为完成。
Pass4完结后,my-wkfl被标记为完成。
流程示例
以下示例流程包含三个状态,Pass1、Parallel1和Pass4。
整体流程从Pass1开始执行,然后指向Parallel1。其中Parallel1又包含了两个分支,Pass2和Pass3,Pass2和Pass3也分别为分支执行起始状态。Parallel1执行完毕后指向Pass4,并最终结束整个流程。
Type: StateMachine
Name: my-wkfl
SpecVersion: v1
StartAt: Pass1
States:
- Type: Pass
Name: Pass1
Next: Parallel1
- Type: Parallel
Name: Parallel1
Next: Pass4
Branches:
- StartAt: Pass2
States:
- Type: Pass
Name: Pass2
End: true
- StartAt: Pass3
States:
- Type: Pass
Name: Pass3
End: true
- Type: Pass
Name: Pass4
End: true