Serverless 工作流支持與多個云服務集成,當使用云服務作為Serverless 工作流任務步驟的執行節點時,您可以根據業務場景對執行的錯誤進行重試或捕獲處理,使您的任務在生產場景中更穩定地運行。本文介紹錯誤處理的方式及如何在不同的業務場景中進行錯誤處理的最佳實踐。
錯誤處理方式
Serverless 工作流的任務步驟不僅支持對錯誤的捕獲,而且也支持對錯誤捕獲后的處理,例如重試及跳轉。更多信息,請參見任務步驟。
- 錯誤重試。
steps: - type: task name: hello resourceArn: acs:fc:{region}:{accountID}:xxx retry: - errors: - FnF.ALL intervalSeconds: 10 maxIntervalSeconds: 300 maxAttempts: 3 multiplier: 2
表 1. 錯誤重試的參數說明 參數 描述 retry
表示該任務步驟錯誤處理類型為重試。 errors
表示需要捕獲的錯誤列表。 intervalSeconds
表示重試的初始間隔時間,最大值是86400秒,默認值是1秒。單位:秒。 maxAttempts
表示最多重試次數,默認值是3次。 multiplier
表示后一次重試比前一次重試間隔時間的倍數,默認值是2。按照上文的代碼示例,第二次重試時間間隔為20秒,第三次重試時間間隔為40秒。 - 錯誤跳轉。
steps: - type: task name: hello resourceArn: acs:fc:{region}:{accountID}:xxx errorMappings: - target: errMsg source: $local.cause #該值為系統預留,在本步驟發生錯誤時可直接使用。 - target: errCode source: $local.error #該值為系統預留,在本步驟發生錯誤時可直接使用。 catch: - errors: - FnF.ALL goto: final
表 2. 錯誤跳轉的參數說明 參數 描述 errorMappings
指定跳轉支持傳遞本步驟中的錯誤字段。 catch
表示該任務節點的捕獲策略。 errors
表示需要捕獲的錯誤列表。 goto
表示當任務拋出對應錯誤后,進行跳轉的對象。
使用函數計算作為Serverless 工作流的執行節點
當使用函數計算作為Serverless 工作流的執行節點時,您需要關注以下錯誤類型:
- 函數計算系統提示的異常錯誤。
- 函數代碼錯誤。
errors
的任務中進行捕獲。函數計算或Serverless工作流系統常見的系統錯誤
常見的錯誤類型如下:
- errors:
- FC.ResourceThrottled
- FC.ResourceExhausted
- FC.InternalServerError
- FC.Unknown
- FnF.TaskTimeout
- FnF.ALL
錯誤類型 | 描述 |
FC.{ErrorCode} | 函數計算服務返回除200的HTTP Code。常見的錯誤類型如下所示:
說明 {Error code} 是函數計算的錯誤碼。詳細信息,請參見錯誤碼列表。 |
FC.Unknown | 函數計算服務調用函數成功,但函數執行出錯,且該錯誤碼未被捕獲,例如UnhandledInvocationError 等。 |
{CustomError} | 函數計算服務調用函數成功,但函數主動拋出異常錯誤。 |
FnF.TaskTimeout | Serverless 工作流某步驟執行超時。 |
FnF.ALL | 捕獲Serverless 工作流系統的所有錯誤。 |
FnF.Timeout | Serverless 工作流整體執行超時。 |
自定義代碼錯誤
除了函數計算和Serverless 工作流系統常見的錯誤類型外,您也可以自定義錯誤類型,在函數代碼中主動拋出異常,方便將函數執行的狀態或錯誤傳遞給Serverless 工作流,然后Serverless 工作流再根據流程對任務進行重試或跳轉。下文以Python為例介紹如何在函數代碼中自定義錯誤類型,并在Serverless 工作流的任務中進行重試處理。具體步驟如下:
- 自定義函數代碼。
... class ErrorNeedsRetry(Exception): pass def handler(event, context): try: # do sth except ServerException: raise ErrorNeedsRetry("custom error message")
- 按需修改Serverless 工作流的任務流程進行函數計算的錯誤捕獲及重試。
retry: - errors: - ErrorNeedsRetry intervalSeconds: 10 maxAttempts: 3 multiplier: 2
使用MNS等其他云服務作為任務的執行節點
當使用其他第三方云服務作為任務的執行節點時,Serverless 工作流將直接調用相應服務的API對任務進行下發。
以MNS為例,當Serverless 工作流需要發送消息時,將調用MNS的SendMessage接口。詳細信息,請參見SendMessage。這類任務通常是API調用,不存在等待函數執行結果的情況,且Serverless 工作流內部會對可重試的錯誤進行多次合理重試。因此,當您使用MNS、視覺智能API等云服務作為任務的執行節點時,在流程中您無需關注錯誤處理。
文檔內容是否對您有幫助?