全部產品
Search
文件中心

CloudFlow:任務步驟

更新時間:Jul 06, 2024

本文介紹了任務步驟和其相關使用樣本。

參數說明

任務(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:跳轉目的步驟名稱。
      說明 該目的步驟只能是和當前任務步驟並列的一個步驟。
表 1. 錯誤定義
函數執行狀態FC響應HTTP CodeFC響應Serverless 工作流程步驟失敗(用於重試和捕獲是否需要重試
沒有執行429ResourceExhaustedFC.ResourceExhausted
沒有執行4xx,非429ServiceNotFoundFunctionNotFoundInvalidArgumentFC.ServiceNotFoundFC.FunctionNotFoundFC.InvalidArgument
不確定500InternalServerErrorFC.InternalServerError
沒有執行503ResourceThrottledFC.ResourceThrottled
函數執行成功,返回錯誤。200使用者自訂錯誤,包含errorTypeerrorType根據業務決定
函數執行異常,返回錯誤。200errorTypeFC.Unknown
函數執行成功,返回非JSON對象。200errorTypeFC.InvalidOutput
其他錯誤
  • FnF.ALL:捕獲所有失敗情況,用於重試或跳轉。

樣本

  • 簡單任務步驟

    下面的樣本流程包含一個任務步驟。

    • 如果流程的輸入是{"name": "function flow"},輸出是{"hello": "function flow"}
    • 如果流程沒有指定輸入或者輸入不包含name key,則任務步驟執行失敗,從而導致整個流程執行失敗。
    • 流程定義
      version: v1
      type: flow
      steps:
        - type: task
          name: hello
          resourceArn: acs:fc:{region}:{accountID}:services/fnf_test/functions/hello           
      resourceArn的參數說明如下:
      • {region}:需替換成您選擇的地區,例如cn-shanghai
      • {accountID}:需替換成您的帳號ID。您可以在Serverless工作流程控制台流程頁面,單擊右上方的頭像查看,如下圖所示。create_flow_step1
    • 函數定義
      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。如果流程沒有指定輸入或者輸入不包含name key,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\"}}",