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

1 分钟阅读
0

对于我的 Amazon Simple Queue Service (Amazon SQS) 队列事件源,我希望 AWS Lambda 函数具有最佳并发。

解决方法

**注意:**当您将 Amazon SQS 队列配置为事件源时,Lambda 函数可以实现最优纵向扩展,每分钟再增加 300 个实例。对于标准队列,最大并发调用数为 1,000。如果使用 FIFO 事件源映射,则函数可以将并发横向缩减到活动消息组的数量。有关更多信息,请参阅 Scaling and processing

找出并解决任何 Lambda 函数调用错误

为防止大规模错误,Lambda 会在发生调用错误时限制函数扩展。在错误得到解决后,Lambda 会继续扩展函数。有关更多信息,请参阅 Backoff strategy for failed invocations。有关如何解决 Lambda 函数调用错误的最佳做法,请参阅 Troubleshooting issues in Lambda如何排查 Lambda 函数故障?

为您的用例配置具有最佳并发的 Lambda 函数

预留并发

如果已在函数上配置预留并发,Lambda 会在函数达到预留值时对其加以限制。事件源映射不考虑预留并发,并且处理的队列中的消息可能比发送到函数的消息多。

为函数预留的并发数必须具有以下最小值:

  • 对于标准 Amazon SQS 队列: 1,000
  • 对于 FIFO 队列: 活动消息组的数量

预留并发数低于 FIFO 队列中的消息组数量并不是最佳做法。预留并发数较低可能会导致 FIFO 队列处理延迟,并导致函数受到限制。

**重要提示:**要限制并发调用的数量,请使用 Amazon SQS 事件源的最大并发设置,而不是预留并发数。

未预留并发

如果未在函数上配置预留并发,则函数的默认未预留并发限额为 1,000。此默认限额也适用于同一 AWS 账户和 AWS 区域中的其他函数。如果在函数的区域中至少有 1,000 个未预留并发,则该函数会扩展,直到达到最大可用并发量。当账户的所有并发都在使用时,Lambda 会限制调用。

**注意:**Lambda 函数最初会根据并发扩展速率进行扩展。

为了防止因流量激增而过度扩展,Lambda 对函数的扩展速度做了限制。并发扩展率定义了帐户中的函数在响应更多的请求时增速的上限。

**重要提示:**并发扩展速率是函数级别的限制。您账户中的每个函数都可独立于其他函数进行扩展。并发扩展速率也不同于账户级别的并发限制,后者提供了函数可用的并发总量。

最大并发设置

最大并发设置会将 Lambda 函数的最大并发执行数限制为不超过配置值。当您为一个事件源设置最大并发数时,该值仅适用于该特定事件源。没有最大并发数的任何其他事件源都将使用账户的剩余并发配额或预留并发数。

最大并发设置和预留并发数可以配合使用。最好不要将最大并发设置设为大于函数的预留并发数,因为这样做可能会导致节流。

确认您的 Amazon SQS 队列中有足够消息,以允许 Lambda 函数进行扩展

如果某个 Amazon SQS 队列被配置为调用 Lambda 函数,则 Lambda 只会在队列中有消息时才会扩展调用。

了解 Amazon SQS 队列中还有多少消息需要处理,请查看 ApproximateNumberOfMessagesVisible 指标。

如果此指标较低或为 0,则说明函数无法扩展。

如果该指标较高且没有调用错误,请增加事件通知的批处理大小。增加批处理大小,直到持续时间指标的增加速度超过批处理大小指标。有关更多信息,请参阅 Monitoring functions on the Lambda console

**注意:**标准 Amazon SQS 队列的最大批处理大小为 10,000 条记录。对于 FIFO 队列,最大批处理大小为 10 条记录。有关更多信息,请参阅 ReceiveMessage

相关信息

将 Lambda 与 Amazon SQS 结合使用

管理 AWS Lambda 函数并发

AWS 官方
AWS 官方已更新 1 个月前