全部產品
Search
文件中心

CloudFlow:錯誤處理

更新時間:Nov 08, 2024

本文介紹錯誤處理的基本概念和相關使用樣本,通過重試機制及捕獲策略,協助您輕鬆應對常見錯誤,提升流程穩定性。

基本概念

CloudFlow整合可能會產生一些預期或者非預期的錯誤,您可針對該情境選擇繼續進行該狀態的操作,或直接引導至下一個狀態。關鍵字FnF.ALL為特殊選項,該選項能夠捕捉所有錯誤。工作流程錯誤處理包含兩部分內容:錯誤重試(Retry)錯誤捕獲(Catch)

支援錯誤處理的狀態類型

針對下面的狀態類型,狀態定義中支援Retry和Catch兩個欄位,分別用於聲明錯誤重試和錯誤捕獲的策略,協助處理狀態中發生的錯誤。

說明

在具體的錯誤處理中,總是按照先執行Retry策略,如果Retry失敗,再執行Catch策略的順序進行錯誤處理。

錯誤重試(Retry)

欄位

類型

是否必選

描述

樣本值

Errors

[]string

可以命中的錯誤清單,請參考常見錯誤類型

-MyCustomError

-FnF.ALL

Description

string

控制台中的策略名稱稱,也是對錯誤重試的描述。

重試策略 #1

MaxAttempts

int

表示最大重試次數。

3

IntervalSeconds

int

表示稍候再試時間,最大值是86400秒。單位:秒。

10

BackoffRate

float

表示下一次稍候再試時間是當前稍候再試時間的倍數。

2

MaxBackoffSeconds

int

表示啟動並執行最大稍候再試時間,最大值是86400秒。單位:秒。

30

說明

錯誤重試規則中,如果使用者針對同一個錯誤類型定義了多個重試規則,在實際的錯誤重試中只會優先按照匹配到的第一個規則進行錯誤重試。

錯誤捕獲(Catch)

欄位

類型

是否必選

描述

樣本值

Errors

[]string

可以命中的錯誤清單,請參考常見錯誤類型

-MyCustomError

-FnF.ALL

Description

string

控制台中的策略名稱稱,也是對錯誤捕獲的描述。

錯誤捕獲規則 #1

OutputConstructor

map[string]any

輸出構造器,與Next搭配使用。

請參見輸出構造器

Next

string

捕獲到指定錯誤時,回退的狀態。

my-next-state

OutputConstructor與Next搭配使用,在流轉至其他狀態的情境下,本身沒有產生符合預期的輸出,即使流轉到下一個狀態也無法處理,因此,此處使用OutputConstructor可以直接構造一個輸出,作為跳轉到目標狀態的輸入。

說明

錯誤/異常捕獲規則中,如果使用者針對同一個錯誤類型定義了多個錯誤捕獲規則,在實際的錯誤處理中只會優先按照匹配到的第一個規則進行捕獲處理。

常見錯誤類型

當前常見錯誤類型主要以Function Compute整合為樣本,其它整合服務相關的錯誤類型請參考對應的整合文檔說明。

錯誤類型

描述

FC.{ErrorCode}

Function Compute服務返回除200的HTTP Code。常見的錯誤類型如下所示:

  • FC.ResourceThrottled:您的函數因為並發度過高被限流。您所有的函數由一個總的並發度控制。CloudFlow執行到任務類型節點時會同步調用Function Compute,此數值與其他調用方式的並發度共用。您可以申請調整該值。

  • FC.ResourceExhausted:您的函數因為資源不足被限流。當出現這類錯誤時,請聯絡我們

  • FC.InternalServerError:Function Compute出現系統錯誤,請重新執行流程。

說明

{Error code}是Function Compute的錯誤碼。詳細資料,請參見錯誤碼列表

FC.Unknown

Function Compute服務調用函數成功,但函數執行出錯,且該錯誤碼未被捕獲,例如UnhandledInvocationError等。

{CustomError}

被呼叫者主動拋出的自訂異常錯誤,例如函數內部業務錯誤,雲工作流程內部業務錯誤。

FnF.TaskTimeout

CloudFlow某步驟執行逾時。

FnF.Timeout

CloudFlow整體執行逾時。

FnF.ALL

捕獲CloudFlow系統的所有錯誤。

常見錯誤處理樣本

基礎錯誤重試

本樣本中如果“my-error-handle-example”整合調用產生錯誤,且命中MyCustomException1,則依照策略最大重試3次,每次重試次數3次耗盡後,當前錯誤會命中MyCustomException1的錯誤捕獲規則,通過OutputConstructor構造一個自訂的錯誤輸出,作為輸入資料流轉至ErrorCatchExit狀態。

Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: 基礎錯誤處理示範
StartAt: my-error-handle-example
States:
  - Type: Task
    Name: my-error-handle-example
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST
      invocationType: Sync
      body: |
        xxx
    Retry:
      - Errors:
          - MyCustomException1
        Description: 重試策略1
        MaxAttempts: 3
        IntervalSeconds: 2
    Catch:
      - Errors:
          - MyCustomException1
        Description: 捕獲策略1
        OutputConstructor:
          ErrorCode: MyCustomException1
          ErrorMessage: MyCustomException1
        Next: ErrorCatchExit
    Next: SucceededExit
  - Type: Pass
    Name: ErrorCatchExit
    End: true
  - Type: Pass
    Name: SucceededExit
    End: true

在儲存前必須驗證resourceArn的合法性:resourceArn:acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST中的resourceArn樣本應替換為您實際的函數ARN。擷取函數ARN的方法,請參見建立事件函數

  • regionId:應為您函數所在的阿里雲地區,例如"cn-beijing"或"cn-hangzhou"。

  • accountId:應為您的阿里雲帳號(主帳號)ID。

  • myfunction:應為您的實際函數名稱。

  • LATEST:表示使用最新版本的函數,您可以根據需要指定具體的版本或別名。

MyCustomException1:您可根據業務的需求,修改成符合您需要的錯誤資訊。

退避錯誤重試

本樣本中如果“my-error-handle-example”整合調用產生錯誤,且命中 MyCustomException2MyCustomException3,則依照策略最大重試3次,初始稍候再試時間是5秒,按照每次退避2.0的速率,會按照 [5, 10, 20, 40] 的間隔時間進行重試,重試次數3次耗盡後,當前錯誤會命中MyCustomException2MyCustomException3的錯誤捕獲規則,通過OutputConstructor構造一個自訂的錯誤輸出,作為輸入資料流轉至ErrorCatchExit狀態。

Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: '退避錯誤處理示範'
StartAt: my-error-handle-example
States:
  - Type: Task
    Name: my-error-handle-example
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST
      body: xxx
    Retry:
      - Errors:
          - MyCustomException2
          - MyCustomException3
        Description: 重試策略2
        MaxAttempts: 3
        IntervalSeconds: 5
        BackoffRate: 2.0
    Catch:
      - Errors:
          - MyCustomException2
          - MyCustomException3
        Description: 捕獲策略2
        Next: ErrorCatchExit
    Next: SucceededExit
  - Type: Pass
    Name: ErrorCatchExit
    End: true
  - Type: Pass
    Name: SucceededExit
    End: true

複雜重試策略

本樣本中如果“my-error-handle-example”整合調用產生錯誤,通過聲明針對FnF.ALL的錯誤重試和錯誤捕獲,當發生除MyCustomException1MyCustomException2MyCustomException3外的其它任何錯誤時,都會首先進行重試,依照策略最大重試3次,初始稍候再試時間是5秒,按照每次退避2.0的速率,由於設定了最大退避稍候再試時間,由於最後一次退避間隔時間40s大於了設定的最大退避稍候再試時間30s,所以實際會按照 [5, 10, 20, 30] 的間隔時間進行重試,重試次數3次耗盡後,會命中FnF.ALL的錯誤捕獲規則,由於沒有自訂的OutputConstructor構造, 預設流轉至ErrorCatchExit狀態。

Type: StateMachine
Name: ErrorHandleExample
SpecVersion: v1
Description: '錯誤處理示範'
StartAt: my-error-handle-example
States:
  - Type: Task
    Name: my-error-handle-example
    Action: FC:InvokeFunction
    TaskMode: RequestComplete
    Parameters:
      resourceArn: acs:fc:{regionId}:{accountId}:functions/myfunction/LATEST
      body: xxx
    Retry:
      - Errors:
          - MyCustomException1
        Description: 重試策略1
        MaxAttempts: 3
        IntervalSeconds: 2
      - Errors:
          - MyCustomException2
          - MyCustomException3
        Description: 重試策略2
        MaxAttempts: 3
        IntervalSeconds: 5
        BackoffRate: 2.0
      - Errors:
          - FnF.ALL
        Description: 重試策略2
        MaxAttempts: 3
        IntervalSeconds: 5
        BackoffRate: 2.0
        MaxBackoffSeconds: 30
    Catch:
      - Errors:
          - MyCustomException1
        Description: 捕獲策略1
        OutputConstructor:
          ErrorCode: MyCustomException1
          ErrorMessage: MyCustomException1
        Next: ErrorCatchExit
      - Errors:
          - MyCustomException2
          - MyCustomException3
        Description: 捕獲策略2
        Next: ErrorCatchExit
      - Errors:
          - FnF.ALL
        Description: 捕獲策略3
        Next: ErrorCatchExit
    Next: SucceededExit
  - Type: Pass
    Name: ErrorCatchExit
    End: true
  - Type: Pass
    Name: SucceededExit
    End: true