本文介绍云工作流的流程定义语言的基础知识和相关使用示例等。
基础知识
云工作流使用YAML格式的流程定义语言来描述和定义业务逻辑。在执行流程时,云工作流服务会根据流程定义解析并驱动执行相关状态流转。
一个流程(Flow)通常包含若干状态(State),这些状态可以是简单的原子状态,例如集成任务(Task)、成功(Succeed)、失败(Fail)、等待(Wait)和传递(Pass)等;也可以是复杂的控制状态,例如选择(Choice)、并行(Parallel)和循环(Map)等。这些状态可以组合嵌套使用,以构建复杂的业务逻辑,例如,一个并行状态的分支可以是一个选择状态。
流程中的状态执行可能出现错误,云工作流提供OnError错误处理能力,支持错误重试或错误流转到其他状态。
云工作流的状态类似于编程语言中的函数,组合类似于函数调用。状态之间通过输入(Input)和输出(Output)传递数据,每个状态由上下文(Context)变量保存数据。状态间可以组合嵌套,如果一个状态包含另一个状态,则称外层状态为内部状态的作用域(Scope)。
定义流程时,您可以使用以下状态。
任务(Task):通过任务(Task)状态调用工作流集成提供的服务。
传递(Pass):通过传递(Pass)状态做占位符规划流程基本结构。
等待(Wait):如果需要等待一段时间,可以通过等待(Wait)状态暂停流程的执行。
选择(Choice):通过选择(Choice)状态定义不同执行路径。
并行(Parallel):通过并行(Parallel)状态并行执行多个分支,这些分支共享同一份输入。
循环(Map):通过循环(Map)状态并行处理数组数据。
成功(Succeed):通过成功(Succeed)状态提前终止流程。
失败(Fail):通过失败(Fail)状态提前终止流程。
流程属性
流程包含以下属性。
字段 | 类型 | 是否必选 | 描述 | 示例值 |
Type | String | 是 | 流程定义DSL类型。 | StateMachine |
SpecVersion | String | 是 | Spec版本。 | 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: Pass3
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被标记为完成。
流程示例
示例一
以下示例流程包含一个任务状态,这个状态为一个Pass状态,实际不执行任何操作。
Type: StateMachine
Name: my-wkfl
Description: test workflow definition
SpecVersion: v1
Timeout: 600
StartAt: Pass
States:
- Type: Pass
Name: Pass
End: true
示例二
以下示例流程包含三个状态,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