函數流是一個面向無服務器計算領域,編排無服務器分布式應用的工作流服務。基于該服務,用戶可以通過Low Code以及可視化的方式將多個獨立的無服務器函數用順序、分支、并行等方式輕松編排成一個完整的應用,并提供監控和管理平臺,用于診斷和調試應用。
本章節主要介紹函數流組件、組件編排規則、表達式運算符和配置示例。
組件說明
函數流提供多種類型的組件,用戶可以通過拖拽組件、配置組件和連接組件進行可視化編排,實現函數任務流的編排。使用函數流功能,請先了解下表。
組件說明
類型 名稱 說明 函數組件 函數 FunctionGraph函數,如何創建函數請參見使用空白模板創建函數。 流程控制器 子流程 把已創建的“函數流”任務作為“子流程”組合成一個新的函數流任務。 并行分支 用于創建多個并行分支的控制器,以便同時執行多個分支任務,并可根據分支執行結束后控制下一步流程。 開始節點 只能加入觸發器,用于標識流程的開始,一個流程只能有一個開始節點。 異常處理 用于控制函數執行失敗后的下一步流程。 循環節點 用于對數組中每個元素進行循環處理。每次循環會執行一次循環內部的子流程。 時間等待 用于控制當前流程在指定時間延遲后再調用下一個流程。 服務節點 用于對多個函數構成的復雜操作進行抽象,可以將多個函數操作合并成一個原子節點進行管理。 條件分支 用于根據條件判斷是否執行下一分支。 結束節點 用于標識流程的結束。
編排規則
-
設計的函數流必須是一個有向無環圖,從開始節點出發,開始節點后續必須且只能連接一個節點(除了異常處理和結束節點);流程必須在某一個節點結束,結束流程有兩種形式:
- 流程中存在的節點沒有任何后繼節點,且后續節點非條件分支,并行分支或開始節點。
- 流程中存在結束節點,且結束節點后續無其他節點。
-
組件設計規則
觸發器和函數
| 參數 | 說明 | 創建函數流時,是否必選 |
|---|---|---|
| 觸發器 | 當前允許流程中配置0-10個觸發器。 觸發器必須配置在開始節點內。 觸發器不允許連接其他任何節點,也不允許被其他節點連接。 |
否 |
| 函數 | 當前允許流程中配置0-99個函數節點。 當函數連接異常處理節點時,最多可以再連接一個非開始節點和非異常處理節點。 當函數不連接異常處理節點時,只能連接一個非開始節點。 |
否 |
流程控制器
| 參數 | 說明 | 創建函數流時,是否必選 |
|---|---|---|
| 子流程 | 該節點選擇已創建的函數流任務。 | 否 |
| 并行分支 | 用于標識節點后面的分支會并行執行。 后繼節點允許連接1-20個節點(除了異常處理,開始節點和結束節點),至少連接一個節點。 |
否 |
| 開始節點 | 用于標識流程開始,每個流程必須有且只能有一個開始節點。 開始節點后面必須接1個節點,后續節點類型不能是結束節點或者異常處理。 |
必選 |
| 異常處理 | 后面可以接0-10個節點,后繼節點不能是開始節點,結束節點和異常處理節點。 | 否 |
| 循環節點 | 用來對數組中每個元素進行循環處理。每次循環會執行一次循環內部的子流程。 循環節點內部子流程需要滿足如下規則: 1. 只能有一個起始節點(沒有前驅節點),起始節點只能使用函數,時間等待節點。 2. 循環節點內部只允許編排函數,時間等待,異常處理節點。 |
否 |
| 時間等待 | 后面可以連接0個或1個節點,節點類型不能是開始節點和異常處理節點。 | 否 |
| 服務節點 | 服務節點由多個函數節點組成,后續節點可以是結束節點或異常處理節點。 | 否 |
| 條件分支 | 后面可以連接2-20個后繼節點,后繼節點類型不能為開始節點,結束節點和異常處理節點。 | 否 |
| 結束節點 | 后面不能接任何節點。 | 否 |
表達式運算符說明
異常處理和條件分支的表達式的結構為 [JsonPath] + [邏輯運算符] + [對比數據],簡單示例:$.age >= 20
JsonPath說明
| Operator | Supported | Description |
|---|---|---|
| $ | Y | 執行查詢的root,所有正則表達式由此啟動。 |
| @ | Y | 過濾正在處理的當前位置。 |
| . | Y | 子節點。 |
| [ (, )] | Y | 數組索引。 |
| [start:end] | Y | 數組切片運算符。 |
| [?()] | Y | 過濾表達式。 表達式必須計算為布爾值。 |
參見示例
- 簡單取值:JSON數據樣例
{
"fruits": [ "apple", "orange", "pear" ],
"vegetables": [{
"veggieName": "potato",
"veggieLike": true
},
{
"veggieName": "broccoli",
"veggieLike": false
}]
}
$.fruits表達式含義:取出fruits下對應的所有value。
$.fruits解析結果:["apple","orange","pear"]
- 簡單過濾:JSON數據樣例
{
"fruits": [ "apple", "orange", "pear" ],
"vegetables": [{
"veggieName": "potato",
"veggieLike": true
},
{
"veggieName": "broccoli",
"veggieLike": false
}]
}
表達式:$.vegetables[?(@.veggieLike == true)].veggieName
表達式含義:取出key值vegetables對應的所有value,并根據過濾條件輸出veggieLike為True的veggieName。
取值結果:[potato]
邏輯運算符說明
使用以下數據作為例子中的輸入參數:
{
"name" : "apple",
"weight": 13.4,
"type": [3,4,6,8],
"obj": {
"a" : 1
}
}
支持的運算符如下:
符號 作用 例子 返回值 備注 == 相等 $.name == 'apple' true 支持的數據類型包括:int,float,string,bool,nil != 不等 $.name != 'apple' false 支持的數據類型包括:int,float,string,bool,nil < 小于 $.weight < 12 false 只支持數字類型 > 大于 $.weight > 12 true 只支持數字類型 <= 小于等于 $.weight <= 13.4 true 只支持數字類型 >= 大于等于 $.weight >= 13.4 true 只支持數字類型 '*' 通配符 $.weight == '*' true 只支持在== 比較中使用 || 或 $.name == 'apple' || $.weight < 12 true 支持使用()的復雜與或邏輯 && 且 $.name == 'apple' && $.weight < 12 false 支持使用()的復雜與或邏輯
說明字符串格式常量需要使用‘’包含,例如:‘apple’
jsonpath表達式中不能出現上述保留字符'=', '!=', '<', '>', '|', '&'
配置示例
示例一
- 新建三個函數,Runtime均使用python 3.9,代碼功能及內容如下所示 。
函數1:函數執行返回result的值為函數調用事件內的input輸入值
import json
def handler (event, context):
input = event.get('input',0)
return {
"result": input
}
函數2:函數執行返回result的值為函數調用事件內的input輸入值+2的結果值
import json
def handler (event, context):
input = event.get('input',0)
return {
"result": input+2
}
函數3:函數執行返回result的值為函數調用事件內的input輸入值平方的結果值
import json
def handler (event, context):
input = event.get('input',0)
return {
"result": input*input
}
- 在函數流編排區域拖拽組件,“并行分支”節點配置如下。
并行分支節點配置

- 函數節點配置如表所示,在3個函數節點均需配置
函數節點配置

- 保存函數流,啟動執行時,定義輸入值如下所示。
{
"input":3
}
- 單擊函數流任務名稱,查看執行結果。
執行結果

示例二
- 在函數編排區域編排與拖拽組件,服務節點選擇“串行模式”。
服務節點配置

- 函數節點分別選擇示例一中創建的函數2、函數3,函數流的配置如下。
函數2配置

函數3配置

- 保存函數流,啟動執行時,定義輸入值如下所示。
{
"input":3
}
- 單擊函數流任務名稱,查看執行結果。
執行結果

示例三
- 新建兩個函數,** **Runtime均使用Python 3.9,代碼內容相同。
import json
def handler (event, context):
print(event)
return {"result":"success"}
- 在函數流編排區域拖拽組件,服務節點的配置如下。
服務節點配置

- 函數1節點配置如下。
函數1節點配置
- 函數2節點配置如下。
函數2節點配置

- 保存函數流,啟動執行時,定義輸入值如下所示。
{
"test":123
}
- 單擊函數流任務名稱,查看執行結果,可以看到兩個函數執行結果合并,分別為result1和result2。
執行結果

說明如果兩個函數執行返回的輸出值結構一致,會導致函數執行結果被覆蓋。
示例四
當函數流里面的函數執行異常時,可以通過“異常處理”來處理執行失敗的函數并可添加重試。函數執行失敗可分為多少情況:函數執行異常;函數內部業務失敗并在返回內容中添加了錯誤碼,例如status,200代表成功,500和404等代表失敗。
- 在函數流編排區域拖拽組件,各節點功能如下。
函數-input:從event取出input輸入值,作為函數返回status的輸出值;
異常處理:開啟重試機制,當函數返回的status為500或404時進行重試,重試間隔1s,最大重試次數8次;
函數-異常記錄:當經過8次重試函數返回的status依舊為500或404時,進行異常記錄;
函數-正常輸出:如果“函數-input”返回的status不為500或404時,執行“函數-正常輸出”。

- 配置異常處理,重試條件: .status==500|| .status==404。

- 添加重試之后依舊失敗的處理邏輯即“函數-異常記錄”。


- 輸入200執行成功。

- 輸入500,異常處理邏輯進行重試和記錄。
