本文介紹天翼云云工作流的流程定義語言。 通過基礎知識和相關使用示例, 可達到基本了解構建和管理業務流程的過程。
基本概述
天翼云云工作流流程定義基于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: truestateDataFilter字段
用于控制當前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過濾數據: | 輸入數據最終過濾為: |