在函数调用的过程中,可能有多种原因导致函数调用失败。不同的错误类型以及调用方式(同步调用、异步调用)都会影响重试策略。您可以配置 死信队列 收集错误事件信息、分析失败原因。
错误类型
在函数调用的过程中,可能有多种原因导致函数调用失败。错误类型分为以下几类:
调用错误
调用错误发生在函数实际执行前。以下情形均会产生调用错误:
- 调用请求错误。例如传入的 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分钟。如果您配置了死信队列,重试超过最长等待时间仍失败的事件会被发送到死信队列,您可进一步处理,否则事件将被函数平台丢弃。 |
调用请求错误和调用方错误 | 当发生该类错误时,除了超限错误,平台将不会对该类其他错误进行重试,原因为其他请求错误即便重试也不会成功。 |