AWS Lambda
开发人员指南

管理并发

AWS Lambda 的扩展单位是并发执行 (有关更多详细信息,请参阅了解扩展行为)。不过,并非所有情况下都需要无限地扩展。例如,您可能出于成本原因需要控制并发、需要调节处理批量事件所花费的时间或者只是想将它与下游资源匹配。为了帮助实现这一点,Lambda 同时提供了账户级别和函数级别的并发执行数限制控制。

账户级别并发执行数限制

默认情况下,AWS Lambda 将给定区域中所有函数的总并发执行数限制为 1000。您可以通过使用 GetAccountSettings API 并查看 AccountLimit 对象来查看账户级别设置。可按如下所述方式提高此限制:

请求提高并发执行数限制

  1. 打开 AWS Support Center 页面,登录 (如有必要),然后选择 Create case

  2. 对于 Regarding,选择 Service Limit Increase

  3. 对于 Limit Type,选择 Lambda,在表单中填写所有必填字段,然后选择页面底部对应于首选联系方法的按钮。

函数级别并发执行数限制

默认情况下,系统会对所有函数的并发执行总数施加并发执行数限制。这种共享并发执行池称为非预留并发分配。如果您尚未设置任何函数级别的并发限制,则非预留并发限制与账户级别并发限制相同。账户级别限制一旦提高,非预留并发限制也会相应地提高。您可以通过使用 GetAccountSettings API 或 AWS Lambda 控制台来查看某个函数的非预留并发分配。对于计入共享并发执行池的函数,在使用 GetFunctionConfiguration API 进行查询时不会显示任何并发值。

您可以选择设置函数的并发执行数限制。您可能出于以下几个原因而选择这样做:

  • 默认行为意味着,一个函数中并发执行数的激增会导致您使用执行数限制分离的函数受到抑制。如果为某个函数设置并发执行数限制,就将为该函数保留指定的并发执行数值。

  • 函数将根据传入请求速率自动扩展,但并非架构中的所有资源都能够做到这一点。例如,关系数据库会对可处理的并发连接数加以限制。您可以为函数设置并发执行数限制,以便与其下游资源支持的值保持一致。

  • 如果您的函数连接到基于 VPC 的资源,则必须确保您的子网有足够的地址容量,可以支持您函数的 ENI 扩展需求。您可以使用以下公式估算大致的 ENI 容量:

    Concurrent executions * (Memory in GB / 3 GB)

    其中:

    • 并发执行 – 这是您工作负载预计的并发度。使用了解扩展行为中的信息确定此值。

    • 内存 (GB) – 您为 Lambda 函数配置的内存量。

您可以为函数设置并发执行数限制,以匹配您拥有的子网大小限制。

注意

如果您需要函数停止处理任何调用,则可选择将并发设置为 0 并限制所有传入执行。

通过为某个函数设置并发限制,Lambda 可确保专门对该函数应用分配,不管处理其余函数的流量多大都是如此。如果超出该限制,该函数将受到限制。该函数在受到限制时的行为取决于事件源。有关更多信息,请参阅 限制行为

注意

并发限制只能在函数级别上设置,不能针对单个版本设置。对给定函数的所有版本和别名的所有调用都会计入函数限制。

预留和非预留并发限制

如果您为某个函数设置并发执行数限制,则将从非预留并发池中扣除该值。例如,如果您账户的并发执行数限制为 1000,并且您具有 10 个函数,则可为一个函数指定 200 的限制,并为另一个函数指定 100 的限制。剩余的 700 将由其他 8 个函数共用。

注意

AWS Lambda 至少会为非预留并发池保留 100 的并发执行数,以便未设置特定限制的函数仍可处理请求。因此,在实践中,如果您的总账户限制为 1000,则您最多能够为单个函数分配 900。

设置每个函数的并发限制 (控制台)

要使用 Lambda 控制台为 Lambda 函数设置并发限制,请执行以下操作:

  1. 登录 AWS 管理控制台并打开 AWS Lambda 控制台。

  2. 无论您是创建新的 Lambda 函数还是更新现有函数,设置并发限制的过程都是相同的。如果您是 Lambda 新手,并且不熟悉函数创建,请参阅创建简单的 Lambda 函数

  3. 配置选项卡下,选择并发。在预留并发中,将该值设置为希望为函数预留的最大并发执行数。请注意,在设置此值时,非预留账户并发值将自动更新,显示对账户中所有其他函数可用的剩余并发执行数。另请注意,如果您想阻止调用此函数,请将该值设置为 0。要删除此账户的专用配额值,请选择使用非预留账户并发

设置每个函数的并发限制 (CLI)

要使用 AWS CLI 为 Lambda 函数设置并发限制,请执行以下操作:

  • 使用 PutFunctionConcurrency 操作,并传入函数名和要为此函数分配的并发限制:

    aws lambda put-function-concurrency --function-name function-name --reserved-concurrent-executions limit value

要使用 AWS CLI 删除 Lambda 函数的并发限制,请执行以下操作:

  • 使用 DeleteFunctionConcurrency 操作并传入函数名:

    aws lambda delete-function-concurrency --function-name function-name

要使用 AWS CLI 查看 Lambda 函数的并发限制,请执行以下操作:

  • 使用 GetFunction 操作并传入函数名:

    aws lambda get-function --function-name function-name

注意

设置每函数并发会影响可用于其他函数的并发池。建议您仅将 PutFunctionConcurrency API 和 DeleteFunctionConcurrency API 的权限分配给管理用户,以便限制可进行这些更改的用户的数目。

限制行为

在达到与某个函数关联的并发限制时,任何进一步调用该函数的请求都将受到限制,即该调用不会执行您的函数。每个受限制调用都会提高该函数的 Amazon CloudWatch Throttles 指标的值。AWS Lambda 将根据受限制的调用请求的来源,使用不同的方式处理这些请求:

  • 并非基于流的事件源:这些事件源中的一部分同步调用 Lambda 函数,另一些则异步调用 Lambda 函数。它们的处理方式各不相同:

    • 同步调用:如果函数被同步调用并受限制,则 Lambda 会返回 429 错误,并且发出调用的服务将负责执行重试操作。ThrottledReason 错误代码说明您是达到了函数级别限制 (如果已指定) 还是账户级别限制 (请参见以下注释)。每项服务可能都有自己的重试策略。有关事件源及其调用类型的列表,请参阅支持的事件源

      注意

      如果您使用 RequestResponse 调用模式通过 AWS 开发工具包来直接调用该函数,则您的客户端将会收到 429 错误,并且您可以重试调用。

    • 异步调用:如果您的 Lambda 函数被异步调用并受到限制,AWS Lambda 会自动重试受限制的事件,最长重试六个小时,并在重试之间有一定的延迟。例如,CloudWatch Logs 最多会重试失败的批处理五次,在重试之间存在一定的延迟。请记住,在使用异步事件来调用 Lambda 函数之前,会将它们排队。您可以配置死信队列 (DLQ) 来调查函数受限的原因。有关更多信息,请参阅 死信队列

  • 基于轮询的也基于流的事件源:Amazon KinesisAmazon DynamoDB、AWS Lambda 轮询您的流并调用 Lambda 函数。当您的 Lambda 函数受到限制时,Lambda 会一直尝试处理受限制的记录批次,直至数据过期。对 Amazon Kinesis 来说,这个时间段可以长达七天。受限制的请求将被视为各分区的阻塞性请求,Lambda 不会从分区中读取任何新记录,直至受限制的记录批次过期或成功。如果流中有多个分区,Lambda 会继续调用未受限制的分区,直至有分区通过。

  • 基于轮询的事件源(非基于流):Amazon Simple Queue Service、AWS Lambda 轮询您的队列并调用 Lambda 函数。当您的 Lambda 函数受到限制时,Lambda 会尝试处理受限制的记录批,直到成功调用它(在这种情况下,消息将从队列中自动删除)或直到队列的 MessageRetentionPeriod 集到期。

监控您的并发使用情况

为了解您的并发执行使用情况,AWS Lambda 提供以下指标:

  • ConcurrentExecutions:此指标显示您的账户级别的并发执行数,以及任何有自定义并发限制的函数的并发执行数。

  • UnreservedConcurrentExecutions:此指标显示已分配给默认“非预留”并发池的函数的并发执行总数。

要了解这些指标及其访问方式,请参阅使用 Amazon CloudWatch