为什么我使用 Amazon SQS 事件源的 Lambda 函数没有实现最优扩展?

上次更新时间:2020 年 1 月 30 日

我的 AWS Lambda 函数使用 Amazon Simple Queue Service (Amazon SQS) 触发器,但它没有按预期方式扩展。如何确保我的函数按照最优并发进行扩展?

简短描述

当您将 SQS 队列配置为事件源并且有消息可用于处理时,Lambda 将首先选择最大并发数,即五个。理想情况下,使用 Amazon SQS 触发器的 Lambda 函数每分钟最高可以扩展 60 个附加实例,最大支持 1000 个并发调用。为确保函数实现最优扩展,必须满足以下条件:

  • 此函数没有产生任何错误。
  • 在该 AWS 区域拥有足够的非预留并发,或者该函数的预留并发至少为 1000 个。
  • 该 SQS 队列中有消息。

解决方法

修复错误

如果 Lambda 尝试调用您的函数时出现任何错误,服务将阻止函数扩展,以防止大规模出现错误。错误修复后,Lambda 将继续扩展您的函数。只要您的账户未达到或接近该区域的扩展或突增并发服务配额,它每分钟最高可以扩展 60 个附加的并发实例。您的函数最多可扩展支持 1000 个并发调用。

如需解决错误的帮助,请参阅 AWS Lambda 故障排除如何排查 Lambda 函数失败的问题?

管理并发

如果您尚未在函数上配置预留并发,它将与同一账户和区域中的其他函数共享 1000 个并发的默认非预留并发配额。如果该区域中至少有 1000 个非预留并发,您的函数将持续扩展,直到达到最大并发数为止。否则系统将在所有非预留并发都已使用时限制调用。

如果您在函数上配置了预留并发,请确保您至少有 1000 个预留并发。如果您配置的预留并发数低于该值,则将在达到预留值时限制您的函数。有关更多信息,请参阅管理 Lambda 函数的并发

注意:如果您确定您在某个区域需要更高的并发数,您可以在 Service Quotas 控制台请求增加服务配额

检查队列深度

Lambda 仅在 SQS 队列中有消息时扩展调用。如果您未在函数的指标中看到任何限制,同时也没有任何错误,请检查 SQS 队列指标 ApproximateNumberOfMessagesNotVisible。该指标显示了仍需处理的消息数。

如果该指标的值较低(或为 0),则您的函数不能扩展。如果指标的值较高且在不断增长,同时也不存在配置错误,请检查触发器的批处理大小配置。从接收队列中的消息到调用您的函数之间会有很小的延迟。如果您的批处理大小设置较低(例如设置为 1),该较小的延迟可能跨所有调用积累并导致队列中的消息堆积。请尝试增加批处理大小,直到持续时间的增加快于批处理大小为止,但批处理大小最大为 10。

注意:如果您将批处理大小设置为 10,但您的 SQS 队列中的消息数少于 1000 个,则您不太可能会在调用中收到完整批次的 10 个消息。有关更多信息,请参阅 Amazon SQS API 参考中的 ReceiveMessage


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?