我的 Amazon Simple Queue Service (Amazon SQS) 队列事件源的 AWS Lambda 函数未按预期扩展。我想配置最佳并发。
解决方法
**注意:**当您将 Amazon SQS 队列配置为事件源时,Lambda 函数可以实现最优纵向扩展,每分钟再增加 300 个实例。标准队列的最大并发执行数为 1,250。如果使用先进先出 (FIFO) 事件源映射,则函数可以将并发横向缩减到活动消息组的数量。
识别并解决 Lambda 函数调用问题
为防止出现大规模错误,Lambda 会在出现调用问题时限制函数扩展。在您解决问题后,Lambda 会继续扩展该函数。有关详细信息,请参阅失败调用的回退策略。要解决 Lambda 函数调用错误,请参阅在 Lambda 中处理 SQS 事件源错误和如何排查 Lambda 函数故障?
为您的 Lambda 函数配置最佳并发
预留并发
如果已在函数上配置预留并发,Lambda 会在函数达到预留值时对其加以限制。事件源映射不包括预留并发,并且处理的队列中的消息比发送到函数的消息多。
对于标准 SQS 队列,函数的最小预留并发必须为 1,250,且等于 FIFO 队列的活动消息组总数。最佳做法是将预留并发设置为高于 FIFO 队列中的消息组数。预留并发较低可能会导致 FIFO 队列处理延迟,并导致函数受到限制。
**重要事项:**要限制并发调用的数量,请使用 Amazon SQS 事件源的最大并发设置,而不是预留并发。
默认并发
对于同一账户和 AWS 区域中的所有函数,您的 AWS 账户的默认并发配额为 1,000。函数可以扩展直到达到最大可用并发。当您的所有函数使用的并发池中的并发达到 1,000 时,Lambda 将限制调用。
Lambda 将限制函数的扩展速度,以便流量突然激增不会导致函数过度扩展。Lambda 函数最初会根据并发扩展速率进行扩展。由于并发扩展速率是函数级别的,因此您账户中的每个函数都可以独立于其他函数进行扩展。并发扩展速率也不同于账户级别的并发配额,后者提供了函数可用的并发总量。
**注意:**默认并发与预置并发不同。有关详细信息,请参阅了解预留并发和预置并发。
最大并发设置
当您为一个事件源设置最大并发时,该值仅适用于该特定事件源。未设置最大并发的其他事件源将使用账户的剩余并发配额或预留并发。
您可以将最大并发设置和预留并发配合使用。最佳做法是将最大并发设置为低于函数的预留并发数,这样函数就不会受到限制。
确认您的 Amazon SQS 队列中有足够消息,以允许 Lambda 函数进行扩展
如果您将某个 Amazon SQS 队列配置为调用 Lambda 函数,则 Lambda 只会在队列中有消息时才会扩展调用。
要使用 Amazon CloudWatch 检查队列中有多少条消息必须处理,请查看队列的 ApproximateNumberOfMessagesVisible 指标。
如果此指标较低或为 0,则说明函数无法扩展。
如果该指标较高且没有调用问题,请增加事件通知的批处理大小,直到持续时间指标不再激增。有关 Lambda 指标的详细信息,请参阅指标类型。
**注意:**标准 Amazon SQS 队列的最大批处理大小为 10,000 条记录。对于 FIFO 队列,最大批处理大小为 10 条记录。
确认 Amazon SQS 正在向队列添加消息
要验证 Amazon SQS 是否正在向队列添加新消息,请查看该队列的 NumberOfMessagesSent 指标。
确认使用者正在调用 ReceiveMessage API
要验证使用者是否正在调用 ReceiveMessage API,请查看队列的 NumberOfMessagesReceived 指标。
**注意:**NumberOfEmptyReceives 指标出现峰值表明使用者正在调用 ReceiveMessage API,但该调用并未从队列中返回消息。当队列中没有消息时,将会出现此问题。
相关信息
将 Lambda 与 Amazon SQS 结合使用
管理 AWS Lambda 函数并发