错误处理

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 工作流的执行节点时,您需要关注以下错误类型:
  • 函数计算系统提示的异常错误。
  • 函数代码错误。
这些错误可以在Serverless 工作流errors的任务中进行捕获。

函数计算或Serverless工作流系统常见的系统错误

常见的错误类型如下:
- errors:
  - FC.ResourceThrottled
  - FC.ResourceExhausted
  - FC.InternalServerError
  - FC.Unknown
  - FnF.TaskTimeout
  - FnF.ALL
表 3. 常见的错误类型
错误类型描述
FC.{ErrorCode}函数计算服务返回除200的HTTP Code。常见的错误类型如下所示:
  • FC.ResourceThrottled:您的函数因为并发度过高被限流。您所有的函数由一个总的并发度控制。Serverless 工作流执行到任务类型节点时会同步调用函数计算,此数值与其他调用方式的并发度共用。您可以申请调整该值。
  • FC.ResourceExhausted:您的函数因为资源不足被限流。当出现这类错误时,请联系我们
  • FC.InternalServerError:函数计算出现系统错误,请重新执行流程。
说明 {Error code}是函数计算的错误码。详细信息,请参见错误码列表
FC.Unknown函数计算服务调用函数成功,但函数执行出错,且该错误码未被捕获,例如UnhandledInvocationError等。
{CustomError}函数计算服务调用函数成功,但函数主动抛出异常错误。
FnF.TaskTimeoutServerless 工作流某步骤执行超时。
FnF.ALL捕获Serverless 工作流系统的所有错误。
FnF.TimeoutServerless 工作流整体执行超时。

自定义代码错误

除了函数计算和Serverless 工作流系统常见的错误类型外,您也可以自定义错误类型,在函数代码中主动抛出异常,方便将函数执行的状态或错误传递给Serverless 工作流,然后Serverless 工作流再根据流程对任务进行重试或跳转。下文以Python为例介绍如何在函数代码中自定义错误类型,并在Serverless 工作流的任务中进行重试处理。具体步骤如下:
  1. 自定义函数代码。
    ...
    class ErrorNeedsRetry(Exception):
        pass
      
    def handler(event, context):
        try:
            # do sth
        except ServerException:
            raise ErrorNeedsRetry("custom error message")
  2. 按需修改Serverless 工作流的任务流程进行函数计算的错误捕获及重试。
    retry:
      - errors:
          - ErrorNeedsRetry
      intervalSeconds: 10
      maxAttempts: 3
      multiplier: 2

使用MNS等其他云服务作为任务的执行节点

当使用其他第三方云服务作为任务的执行节点时,Serverless 工作流将直接调用相应服务的API对任务进行下发。

以MNS为例,当Serverless 工作流需要发送消息时,将调用MNS的SendMessage接口。详细信息,请参见SendMessage。这类任务通常是API调用,不存在等待函数执行结果的情况,且Serverless 工作流内部会对可重试的错误进行多次合理重试。因此,当您使用MNS、视觉智能API等云服务作为任务的执行节点时,在流程中您无需关注错误处理。