本文介紹云工作流的流程定義語言,通過基礎知識和相關使用示例,讓您輕松熟悉構建和管理業務流程的技巧。
基礎知識
云工作流的流程定義語言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):用于提前結束一系列狀態的執行,在需要根據特定條件提前結束流程或子流程時非常有用。
失?。‵ail):用于處理工作流執行過程中出現的預期或非預期錯誤。
流程屬性
流程包含以下屬性。
字段 | 類型 | 是否必選 | 描述 | 示例值 |
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