最佳实践

输入关键词搜索相关文档
文档中心 > 云函数 > 开发指南 > 错误类型与重试策略

错误类型与重试策略

最近更新时间:2021-01-18 18:01:30

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

错误类型

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

调用错误

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

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

运行错误

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

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

系统错误

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

重试策略

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

同步调用

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

注意:

Ckafka 触发器会创建后台模块作为消费者,连接 CKafka 实例并消费消息。后台模块在获取到消息后,同步调用触发函数。由于 CKafka 触发器的后台模块是由云函数侧维护,即使是同步调用,其重试策略仍由云函数侧控制。

  • 对于运行错误(含用户代码错误和 Runtime 错误),CKafka 触发器会按照您配置的重试次数进行重试。默认重试10000次。
  • 对于超限错误和系统错误,CKafka 触发器会采用指数退避的方式持续重试,直至成功为止。

异步调用

异步调用包含 云 API 触发器 的异步调用、COS 触发器定时触发器CMQ Topic 触发器 等,具体触发器调用类型请参考相关触发器说明文档。
您可以根据业务诉求在函数配置中修改和自定义默认的【重试次数】,【最长等待时间】配置,该配置只适用于异步调用场景。

  • 重试次数:函数返回错误时云函数重试的次数,该参数只适用于运行错误的策略配置,默认配置为2次。
  • 最长等待时间:云函数在异步事件队列中保留事件的最长时间,该参数适用于所有异步调用的重试配置,默认配置为6小时,最大长度支持10w条。

异步调用发生各种错误类型的重试策略:

错误类型 重试策略
运行错误
(用户代码运行错误和 Runtime 错误)
当发生该类错误时,函数平台将默认重试两次或使用配置的重试次数,固定间隔1分钟。在自动重试的同时,新的触发事件仍可正常处理。如果您配置了死信队列,三次失败后的事件将传入死信队列,否则事件将被函数平台丢弃。
系统错误 当发生该类错误时,函数平台会根据您配置的最长等待时间持续重试(默认持续重试6小时),重试间隔按照指数退避增加到5分钟。如果您配置了死信队列,重试超过最长等待时间仍失败的事件会被发送到死信队列,您可进一步处理,否则事件将被函数平台丢弃。
超限错误 当发生该类错误时,函数平台会根据您配置的最长等待时间持续重试(默认持续重试6小时),重试间隔为1分钟。如果您配置了死信队列,重试超过最长等待时间仍失败的事件会被发送到死信队列,您可进一步处理,否则事件将被函数平台丢弃。
调用请求错误和调用方错误 当发生该类错误时,除了超限错误,平台将不会对该类其他错误进行重试,原因为其他请求错误即便重试也不会成功。
目录