本文介绍天翼云云工作流的流程定义语言。 通过基础知识和相关使用示例, 可达到基本了解构建和管理业务流程的过程。
基本概述
天翼云云工作流流程定义基于CNCF ServerlessWorkflow Specification 0.8版本进行适配优化的。其主要特征是一种基于YAML的声明式工作流规范,用于定义由事件驱动的无服务器应用编排逻辑。它通过状态(State)组织任务流,支持顺序/并行执行(Parallel状态)、条件分支(Switch状态)、暂停(Sleep状态)等控制逻辑,并能通过错误捕获(Catch策略)和重试机制(Retry策略)实现容错处理。其核心特点包括与云服务事件源的无缝集成、状态间数据传递(Data Input/Output)等。所有状态(State)共享基础属性:名称(name)、类型(type)、输入输出(Data Input/output)。通过组合这些状态类型,可以构建出复杂的业务流程。
流程通常包含若干状态(State),这些状态可以是简单的执行类状态,例如任务(Operation)、暂停(Sleep)、传递(Noop)和失败(Fail)等;也可以是复杂的流程控制类状态,例如选择(Switch)、并行(Parallel)和迭代(Foreach)。其作用列举如下:
操作(Operation):主要是用于调用集成服务API来完成特定任务, 利用任务类型状态可以执行一个函数调用,调用天翼云云服务API,也可以通过HTTP/HTTPS等通用协议发起第三方服务调用。
传递(Noop):是一种特殊的Operation类型状态, 它主要利用场景是用于在流程编排过程中的一种占位符作用的存在。可当作空白节点或者作为数据预处理节点将输入数据结构转换成期望的输出。
失败(Fail):是一种特殊的Operation类型状态。Fail状态会返回失败结果,可用于提前结束工作流执行并将执行结果置为失败。
暂停(Sleep):用于暂停工作流执行, 可将工作流按照指定时长等待或者暂停至特定时间点后继续执行。
条件分支(Switch):根据条件表达式选择执行路径,类似编程中的switch-case,灵活控制流程方向。
并行(Parallel):并行执行多个分支,合并各分支结果,适用于需要同时处理多项任务的场景。
迭代(Foreach):并行遍历输入数组,对每个元素执行处理器逻辑,类似foreach循环,高效处理批量数据。
状态(State)是工作流的基本执行单元,每个状态代表流程中的一个步骤,包含输入处理、业务逻辑执行和输出传递功能。状态之间通过转换(transition)形成有向关系,共同构成完整的工作流。
流程(workflow)基本架构
流程(workflow)主要包含以下属性:
字段 | 类型 | 是否必须 | 含义 |
---|---|---|---|
specVersion | string | 否 | 工作流定义spec的版本,每个版本之间可能spec有较大的改动,用来兼容标志新旧spec的定义,当前基于CNCF 0.8版本,因此缺省值是0.8 |
name | string | 是 | 工作流名称 |
description | string | 否 | 工作流作用描述 |
start | string | 是 | 工作流开始的state名称, state必须是states数组中的一个 |
states | []object | 是 | 工作流执行的各个state定义列表,见state结构定义,通过transition的字段关联起整个states列表从而形成工作流 |
timeout | string | 否 | 工作流的执行的超时时间, 按照整型+单位(ns|us|ms|s|m|h)格式进行定义。快速工作流缺省值是5min,即300s;标准工作流缺省值是365天, 即31536000s。
|
一个简单的流程定义如下:
specVersion: "0.8"
name: "demo"
start: "Hello"
states:
- name: "Hello"
type: "Operation"
actions:
- functionRef:
type: "Noop"
end: true
状态(state)通用结构
状态(state)的通用结果主要包含以下属性, 各个状态(Operation|Sleep|Switch|Parallel|Foreach)的详细结构以及特有属性见状态流转说明。
字段 | 类型 | 是否必须 | 含义 |
---|---|---|---|
name | string | 是 | state名称 |
type | string | 是 | state类型, 主要是Operation|Sleep|Switch|Parallel|Foreach这五种类型。 |
transition | object | transition和end二选一 | 当前state执行完跳转的下一个state。 见transtion字段详细说明 |
end | bool | transition和end二选一 | 该state执行完后整个工作流停止执行 |
metadata | object | 否 | 用于对state一些信息补充,例如description字段 用于描述state的一些功能 |
stateDataFilter | object | 否 | 用于输入输出数据过滤。 见stateDataFilter字段详细说明 |
transtion字段
当前只支持到nextState属性,用于标记下一个跳转的state名称
字段 | 类型 | 是否必须 | 含义 |
---|---|---|---|
nextState | string | 是 | 下一个跳转state的名称,下一个state必须声明的states中的其中一个 |
一个简单的涉及transtion和end属性设置的流程定义, "Hello"状态即设置了transtion属性字段,通过nextState指定了下一个跳转的状态是Final状态。 Final状态设置了end属性为true,代表工作流执行到该状态时并执行完成, 则该工作流执行结束。
specVersion: "0.8"
name: "demo"
start: "Hello"
states:
- name: "Hello"
type: "Operation"
actions:
- functionRef:
type: "Noop"
transition:
nextState: "Final"
- name: "Final"
type: "Operation"
metadata:
description: "工作流执行的最后一个节点定义"
actions:
- functionRef:
type: "Noop"
end: true
stateDataFilter字段
用于控制当前state输入输出字段的过滤,按照jsonPath方式获取指定路径的输入输出参数或者按照指定结构重新构造参数。
字段 | 类型 | 是否必须 | 含义 |
---|---|---|---|
input | string(单一jsonPath表达式)/object | 否 | 按照jsonPath方式获取指定路径的输入参数或者按照object结构重新构造输入参数 |
output | string(单一jsonPath表达式)/object | 否 | 按照jsonPath方式输出指定路径的输出参数或者按照object结构重新构造输出参数 |
以输入处理为例, state的输入数据如下:
{
"testInt": 123,
"testString": "1234",
"testMap": {
"k1": "v1",
"k2": "v2"
}
}
按照jsonPath过滤输入数据或者object重构输入数据, 使用方式如下:
方式 | 结果 |
---|---|
按照object重新构造数据结构:
| 输入数据最终重构为:
|
基于jsonPath过滤数据:
| 输入数据最终过滤为:
|