文档中心 云函数 开发指南 错误类型与重试策略

错误类型与重试策略

最近更新时间:2020-01-16 17:14:01

在函数调用的过程中,可能有多种原因导致函数调用失败。不同的错误类型以及调用方式(同步调用、异步调用)都会影响重试策略。您可以配置死信队列收集错误事件信息、分析失败原因。

错误类型

在函数调用的过程中,可能有多种原因导致函数调用失败。错误类型分为以下几类:

调用错误

调用错误发生在函数实际执行前。以下情形均会产生调用错误:

  • 调用请求错误。例如传入的 Event 数据结构过大、入参不符合要求、函数不存在等。
  • 调用方错误。主要出现在调用方权限不足的情形。
  • 超限错误。调用的并发数超出 最大并发数 限制。

运行错误

运行错误发生在函数实际运行中。运行错误有以下情形:

  • 用户代码运行错误。这类错误出现在用户代码执行过程中,例如函数代码抛出异常,或者返回结果格式问题等。
  • Runtime 错误。函数运行过程中,Runtime 负责拉起用户代码并执行。Runtime 错误指的是 Runtime 发现并上报的错误,例如函数运行超时(超时的时间限制请参见 限制说明)、代码语法报错等。

系统错误

函数平台的错误,例如 internal error。

重试策略

不同错误类型以及调用方式(同步调用、异步调用)都会影响重试策略。

同步调用

同步调用有两种: 云 API 触发器 的同步调用及 API 网关触发器
由于同步调用的过程中,错误信息会直接返回给用户,所以在同步调用中发生错误时,平台不会自动重试,重试策略(是否重试、重试几次)均由调用方决定。

异步调用

异步调用有五种:云 API 触发器 的异步调用、COS 触发器定时触发器CMQ Topic 触发器CKafka 触发器
当异步调用发生以下类型错误时,重设策略如下:

  • 运行错误(含用户代码运行错误Runtime 错误):当发生该类错误时,函数平台将自动重试两次。第一次与原事件间隔1分钟,第二次与第一次间隔2分钟。在自动重试的同时,新的触发事件仍可正常处理。如果您配置了死信队列,三次失败后的事件将传入死信队列,否则事件将被函数平台丢弃。
  • 超限错误系统错误:当发生该类错误时,函数平台会持续进行重试24小时,重试间隔按照指数退避增加到1小时。如果您配置了死信队列,重试超过24小时仍失败的事件会被发送到死信队列,由用户进行进一步处理,否则事件将被函数平台丢弃。
  • 调用请求错误调用方错误:当发生该类错误时,平台不会进行重试,因为此类错误即便重试也不会成功。

死信队列

死信队列是一个用户账号下的 CMQ 队列,可用于收集错误事件信息、分析失败原因。如果您给函数配置了死信队列,当函数平台对用户代码运行错误重试2次依然失败,或者超限错误系统错误重试超过24小时,该事件会发送至死信队列。

说明:

死信队列功能目前处于内测阶段,如需使用请申请开通消息队列 CMQ。

死信队列消息属性

  • RequestID:事件唯一标识
  • ErrorCode:事件错误码
  • ErrorMessage:错误信息

死信队列创建流程

说明:

云函数目前支持 CMQ 的主题模式和队列模式作为死信队列,您可自行选择配置。

  1. 登录 CMQ 消息队列控制台,创建您的死信队列。
    CMQ 的主题模式支持标签过滤与路由匹配两种筛选方案,为了确保您的订阅者可以收到所有错误信息,请在添加订阅者时标签栏筛选设为,BindingKey 筛选填“#”
  2. 登录 云函数控制台,创建您的函数。
    函数的运行角色必须拥有 CMQ 的 Topic 与 Queue 访问权限,SCF 默认运行角色已为您配置此权限。如果使用自定义角色,请注意添加权限。
  3. 配置死信队列。
    您可以在“新建函数”页面或“函数配置”页面进行死信队列的配置。