最佳实践

有奖征文|投稿上云技术实践,赢取价值5000元大奖> HOT
文档中心 > 云函数 > 开发指南 > 错误类型与重试策略

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

错误类型

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

调用错误

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

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

运行错误

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

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

系统错误

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

重试策略

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

同步调用

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

注意:

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

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

异步调用

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

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

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

错误类型 重试策略
系统错误 函数请求执行状态码为 500。当发生该类错误时,函数平台会根据您配置的最长保留时间持续重试(默认持续重试6小时),重试间隔 1 分钟。如果您配置了死信队列,重试超过最长保留时间仍失败的事件会被发送到死信队列,您可进一步处理,否则事件将被函数平台丢弃。
超限错误 函数请求执行状态码为 432。当发生该类错误时,函数平台会根据您配置的最长保留时间持续重试(默认持续重试6小时),重试间隔 1 分钟。如果您配置了死信队列,重试超过最长保留时间仍失败的事件会被发送到死信队列,您可进一步处理,否则事件将被函数平台丢弃。
运行错误
(除系统错误与超限错误外,其他错误均为运行错误)
当发生该类错误时,函数平台按照配置的重试次数进行重试,重试间隔 1 分钟。在自动重试的同时,新的触发事件仍可正常处理。如果您配置了死信队列,按照配置的重试次数重试后仍失败的事件或超出最长等待时间的事件将传入死信队列,否则事件将被函数平台丢弃。
注意:

  1. 由于运行机制差异,重试及死信队列配置对于异步调用的 异步执行 函数在执行过程中发生错误的请求无效。
  2. 如何判断是否超出最长等待时间?事件重试的时间-事件首次触发的时间大于最长等待时间即为超出最长等待时间。
目录