基本介绍
本文介绍了流程定义语言的基本知识和相关使用示例。
流程定义语言
流程定义语言是一种基于 YAML
的结构化语言,用于定义状态机、节点,包括负责执行的 operation 节点,决定下一跳的 switch 节点,停止执行并抛出错误的 fail 节点等各类节点,这些节点组合起来可以构建复杂的业务逻辑。
下面为一个简单示例,工作流通过输入数据中的 doExec
值判断是否进入 operation 节点执行 CFC 函数。
name: demo
start: demoSwitch
version: 1.0.0
timeoutSeconds: 100
description: "XFlow 流程定义语言示例"
states:
- type: switch
name: demoSwitch
description: "whether to exec demo"
conditions:
- condition: .doExec == true
next: invokeFunc
- condition: .doExec == false
next: stop
- type: operation
name: invokeFunc
description: "invoke a function"
resource: "brn:bce:cfc:su:7c54a6e148:function:test:$LATEST"
end: true
- type: fail
name: stop
cause: "demo stopped"
字段 | 描述 |
---|---|
name(必需) | 流程定义语言的名字 |
start(必需) | 用于指定流程的开始节点 |
states(必需) | 节点定义的集合 |
version(可选) | 版本信息,需要符合 semver 规则 |
timeoutSeconds(可选) | 工作流的超时时间,单位为秒,最长为 172800,如果流程实际执行超过该时间则会被终止 |
description(可选) | 描述信息 |
节点类型
节点是工作流的一个基本单元,所有的节点都定义在工作流的 states
参数里。每个节点都有自己的类型,在节点内部使用 type
参数来表示。目前工作流支持的节点类型如下:
-
传递节点(pass)
pass 节点可以直接生成常量数据,可用来在初始构建阶段提前占位,或通过修改输出调试工作流。
-
选择节点(switch)
根据节点的输入数据做条件判断,选择执行不同的分支节点。
-
等待节点(wait)
等待一段时间,不做其它操作。
-
失败节点(fail)
终止工作流的执行,并把结果执行标记为失败。
-
成功节点(succeed)
终止工作流的执行,并把结果执行标记为成功,类似编程语言中的
return 0;
。 -
任务节点(operation)
负责调用 CFC 函数。
-
并行节点(parallel)
可在节点内定义多个子分支,并行执行。
-
循环节点(foreach)
循环处理数组数据,类似编程语言中的
for
循环。
节点拓扑关系
工作流开始运行时,首先进入 start
字段对应的节点。在一个节点内部, 定义 next: invoke
表示节点的下一跳指向为 invoke 节点,定义 end: true
表示该节点为结束节点,没有下一跳。在节点执行完成后,XFlow 就会根据这些定义来决定接下来的动作。
关于工作流的开始、结束、下一跳指向,在定义时需要遵循如下原则:
-
节点需要明确定义下一跳指向或结束
节点必须定义且只能定义
next
或end
其中的一个,流程的最后一个节点需要定义end: true
。fail/succeed 节点是一种特殊情况,它们表示工作流的执行已结束,已经内含了
end
逻辑,因此不允许再指定next
和end
参数。 -
只能有一个开始节点,可以有多个结束节点
一个工作流内可能会存在多个分支,比如 parallel 节点定义了两个同时执行的分支节点,每个分支的最后一个节点,都需要表明自己为结束节点,即定义
end: true
。 -
节点有层级和分支之分,不同层级、分支的节点是隔离的
以 parallel 节点为例,parallel 节点内可定义多个节点分支,分支内的节点与 parallel 节点是父子关系,并不在一个层级,因此分支内的节点不可以用
next
指向上层级的节点,同样上层节点的next
也不可以指向子层级。另外,不同分支的节点之间也是隔离的。在下面示例中,s1、s2 节点在 hello 节点内部,因此它们的
next
不可以设置为外层的 world 节点。s3 节点与 s1、s2 虽然在一个节点,但它们属于不同分支,因此 s3 也不可以指向 s1、s2。name: parallel-demo start: hello states: - type: parallel name: hello branches: - start: s1 states: - type: pass name: s1 next: s2 - type: pass name: s2 end: true - start: s3 states: - type: wait name: s3 seconds: 3 end: true next: world - type: succeed name: world
示例图如下所示: