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等云服务作为任务的执行节点时,在流程中您无需关注错误处理。
文档内容是否对您有帮助?