我想对 AWS Lambda Amazon Simple Queue Service (Amazon SQS) FIFO(先进先出)事件源上高于消息组 ID 或最大并发值的并发量问题进行故障排除。
简短描述
当您将 Lambda 与 Amazon SQS FIFO 事件源一起使用时,并发量等于或小于队列中 MessageGroupIds 的数量。
以下原因可能导致该函数的并发量高于队列中唯一且活跃的 MessageGroupIds 的数量:
- 多个事件源使用相同的函数。
- 保留期短于函数的运行时。
- Lambda 并发量指标高于 MessageGroupIds 的数量。
- 您使用 Lambda 扩展。
解决方法
多个事件源使用相同的函数
确保该函数只有一个事件源。当一个函数有多个事件源时,另一个事件源可能正在使用该函数并导致更高的并发量。
保留期短于函数的运行时
如果为队列配置的保留期短于函数的运行时,则延长队列的保留期。
此外,由于 Lambda 不跟踪来自同一 MessageGroupId 的消息,也不会在消息可用时立即轮询消息,因此并发量会增加。为确保消息在 Lambda 函数操作期间不会过期,请延长 SQS FIFO 队列保留期。对于 MessageGroupId,消息按 FIFO 顺序处理。
Lambda 并发量指标高于 MessageGroupIds 的数量
由于指标的生成方式,Lambda 并发量指标可能高于 MessageGroupIds 的数量。不会同时调用更多消息。取而代之的是,对于每条调用的消息,Lambda 会将并发计数器增加一,然后在调用完成并返回响应时减少并发计数器的计数。
对于事件源映射,并发量是并行 Lambda 处理程序操作的次数。对于 Lambda 后端,完成了处理程序代码操作且当前处于后处理阶段的函数会计入总并发量。
此外,Lambda 将预留并发量视为与事件源映射类似。最佳实践是不设置预留并发量。如果您必须设置预留并发量,则将其设置为略高于 MessageGroupIds 数量的值。
**注意:**只有在上一条消息完成后,才会调用新消息。消息始终按顺序处理。
Lambda 扩展导致高并发量
当您使用 Lambda 扩展时,可能会出现高并发量,因为扩展在 Lambda 操作完成后会继续运行。例如,附加了一个扩展且未调用 /next,但运行时调用了 /next。
要检查您的 Lambda 扩展是否会导致高并发量,请采取以下操作:
- 监控 PostRuntimeExtensionsDuration 性能指标,以确定运行时 Next API 和最后一个扩展 Next API 之间的累积时间。
- 在 Lambda 函数完成后,检查您的 Lambda 扩展是否仍在运行和保留环境。
- 检查您的 Lambda 实例是否超过了函数并发量。当两个实例同时处于同一个环境中时,会发生节流。有关更多信息,请参阅使用 Lambda 扩展 API 来创建扩展。
- 将 ConcurrentExecutions 指标与 PostRuntimeExtensionsDuration 指标进行比较。检查最大 ConcurrentExecutions 是否超过 Amazon SQS 事件源的配额。有关更多信息,请参阅监控并发量。
相关信息
将 Lambda 与 Amazon SQS 结合使用