本文介紹了任務步驟和其相關使用樣本。
參數說明
任務(Task)步驟定義了Function Compute服務的函數調用資訊,執行任務步驟會調用相應的函數。
任務步驟包含以下屬性:
type:task表示該步驟是任務步驟。name:步驟名稱。resourceArn:資源標識,當前支援函數、訊息佇列、Serverless 工作流程流程,例如acs:fc:cn-shanghai:18807708****3420:services/fnf_test/functions/hello。更多資訊,請參見服務整合。- 可選:pattern:整合服務的執行模式,不同的整合服務支援不同的執行模式。預設值為
requestResponse,枚舉值如下:requestResponse:同步等待任務執行結束後繼續該步驟。sync:非同步提交任務後,等待任務執行結束,獲得任務返回結果後繼續該步驟。waitForCallback:非同步提交任務後(例如完成函數調用後)當前步驟暫停,直到收到關於該任務的回調或該任務逾時。
- 可選:
timeoutSeconds:任務逾時時間。如果任務執行超過指定的逾時時間,則任務步驟執行逾時。 - 可選:
end:當前步驟結束後是否繼續執行其後定義的步驟。 - 可選:
inputMappings:輸入映射。任務步驟的輸入會被用作函數調用的event,更多資訊,請參見InvokeFunction。 - 可選:
outputMappings:輸出映射。其中的$local是函數調用的返回結果,其格式必須是JSON類型。說明 如果未指定輸出映射,本步驟預設將$local作為輸出。 - 可選:
errorMappings:錯誤映射。本映射僅在步驟執行出錯,且配置catch時生效。可以通過$local.cause及$local.error將錯誤資訊映射至輸出,並傳遞給下個步驟。說明$local.error及$local.code為系統預留欄位,mapping中的source欄位必須取這兩個值,詳細資料,請參見本文樣本。另外,errorMappings為可選欄位,如果未指定則發生錯誤後無法在下一步驟擷取相關錯誤資訊。 retry:定義了一組重試策略,其中每一個重試策略包含以下屬性:errors:定義了一個或者多個錯誤,更多資訊,請參見錯誤定義。intervalSeconds:重試的初始間隔時間,最大值是86400秒,預設值是1秒。maxIntervalSeconds:重試的最長間隔時間,最大值和預設值是86400秒。maxAttempts:最多重試次數,預設值是3次。multiplier:後一次重試比前一次稍候再試時間的倍數,預設值是2。
catch:定義了一組捕獲策略,其中每一個捕獲策略包含如下屬性:errors:定義了一個或者多個錯誤,詳情請參見下面表格。goto:跳轉目的步驟名稱。說明 該目的步驟只能是和當前任務步驟並列的一個步驟。
| 函數執行狀態 | FC響應HTTP Code | FC響應 | Serverless 工作流程步驟失敗(用於重試和捕獲) | 是否需要重試 |
| 沒有執行 | 429 | ResourceExhausted | FC.ResourceExhausted | 是 |
| 沒有執行 | 4xx,非429 | ServiceNotFound、FunctionNotFound、InvalidArgument等 | FC.ServiceNotFound、FC.FunctionNotFound、FC.InvalidArgument等 | 否 |
| 不確定 | 500 | InternalServerError | FC.InternalServerError | 是 |
| 沒有執行 | 503 | ResourceThrottled | FC.ResourceThrottled | 是 |
| 函數執行成功,返回錯誤。 | 200 | 使用者自訂錯誤,包含errorType。 | errorType | 根據業務決定 |
| 函數執行異常,返回錯誤。 | 200 | 無errorType | FC.Unknown | 是 |
| 函數執行成功,返回非JSON對象。 | 200 | 無errorType | FC.InvalidOutput | 否 |
其他錯誤:
FnF.ALL:捕獲所有失敗情況,用於重試或跳轉。
樣本
- 簡單任務步驟
下面的樣本流程包含一個任務步驟。
- 如果流程的輸入是
{"name": "function flow"},輸出是{"hello": "function flow"}。 - 如果流程沒有指定輸入或者輸入不包含
namekey,則任務步驟執行失敗,從而導致整個流程執行失敗。
- 流程定義
version: v1 type: flow steps: - type: task name: hello resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/helloresourceArn的參數說明如下:{region}:需替換成您選擇的地區,例如cn-shanghai。{accountID}:需替換成您的帳號ID。您可以在Serverless工作流程控制台的流程頁面,單擊右上方的頭像查看,如下圖所示。
- 函數定義
import json class MyError(Exception): pass def handle(event, context): evt = json.loads(event) if "name" in evt: return { "hello": evt["name"] } else: raise MyError("My unhandled exception")
- 如果流程的輸入是
- 錯誤重試
下面的樣本會重試
MyError。如果流程沒有指定輸入或者輸入不包含namekey,Serverless 工作流程服務會根據重試策略多次重試失敗任務調用。- 在第一次發生錯誤後等待3秒,然後再次調用函數。
- 在第二次發生錯誤後等待6秒(
intervalSeconds x multiplier),然後再次調用函數。 - 在第三次發生錯誤後等待12秒(
intervalSeconds x multiplier x multiplier),然後再次調用函數。 - 經過三次重試後,函數仍然返回錯誤,重試次數超過
maxAttempts,任務步驟失敗,流程以失敗結束。
version: v1 type: flow steps: - type: task name: hello resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello retry: - errors: - MyError intervalSeconds: 3 maxAttempts: 3 multiplier: 2 - 錯誤捕獲
下面的樣本會對捕獲
MyError,然後跳轉到final步驟。由於錯誤被成功捕獲,最後流程以成功結束。version: v1 type: flow steps: - type: task name: hello resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello catch: - errors: - MyError goto: final - type: pass name: pass1 - type: pass name: final - 帶錯誤映射的錯誤捕獲
下面的樣本會對
MyError捕獲,然後跳轉到final步驟。由於進行了錯誤映射,可以在final步驟中擷取錯誤資訊並進行處理。最後流程以成功結束。當然,您也可以將該步驟的輸入、常量等在errorMappings中進行輸出映射。version: v1 type: flow steps: - type: task name: hello resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello errorMappings: - target: errMsg source: $local.cause #該值為系統預留,在本步驟發生錯誤時可直接使用 - target: errCode source: $local.error #該值為系統預留,在本步驟發生錯誤時可直接使用 catch: - errors: - MyError goto: final - type: pass name: pass1 - type: pass name: final映射後在進入final步驟的
event中將看到EventDetail為如下內容:"EventDetail": "{\"input\":{},\"local\":{\"errorCode\":\"MyError\",\"errorMsg\":\"some message\"}}",