在使用亚马逊 SQS 作为事件源时引入 亚马逊云科技 Lambda 函数的最大并发性

作者: 朱利安·伍德 |

这篇博客文章由解决方案架构师 John Lee 和 Jeetendra Vaidya 撰写。

亚马逊云科技 L ambda 现在提供了一种控制 A mazon SQS 作为事件源调用 的最大并发函数数量的方法。您可以使用此功能控制 Lambda 函数在单个 SQS 队列中处理消息的并发性。

这篇文章介绍在使用 SQS 作为 Lambda 的事件源时如何设置 SQS 触发器的最大并发度。它还概述了使用这种架构模式的 Lambda 扩展行为、该功能有助于解决的挑战以及最大并发功能的演示。

概述

Lambda 使用 事件源映射 来处理流或队列中的项目。事件源映射从事件源(例如 SQS 队列)读取,可以选择筛选消息,对其进行批处理,然后调用映射的 Lambda 函数。

Lambda 与 SQS FIFO 队列集成的扩展行为很简单。 单个 Lambda 函数处理单个消息组中的批量消息,以确保消息按顺序处理。

对于 SQS 标准队列 ,事件源映射轮询队列以消耗传入的消息,从五个并发批次开始,一次使用五个函数。将消息添加到 SQS 队列后,Lambda 会继续向外扩展以满足需求,每分钟最多添加 60 个函数,最多 1,000 个函数来使用这些消息。要了解有关 Lambda 扩展行为的更多信息,请阅读 “ 了解 亚马逊云科技 Lambda 如何通过 Amazon SQS 标准队列进行扩展 ”。

Lambda processing standard SQS queues

Lambda 正在处理标准 SQS 队列

挑战

当 SQS 队列中有大量消息时,Lambda 会向外扩展,添加其他函数来处理消息。向外扩展可能会消耗账户中的并发配额。为了防止这种情况发生,您可以 为单个 Lambda 函数设置 预留并发 性。这确保了指定的 Lambda 函数始终可以扩展到那么多的并发性,但也不能超过这个数字。

当 Lambda 函数的并发性达到预留的并发限制时,队列配置会指定后续行为。消息将返回到队列并根据重新驱动策略重试,根据其保留策略过期,或者发送到另一个 SQS 死信队列 (DL Q)。 虽然向 DLQ 发送未处理的消息是保留消息的好选择,但它需要单独的机制来检查和处理来自 DLQ 的消息。

以下示例显示 Lambda 函数达到其预留并发配额 10。

Lambda reaching reserved concurrency of 10.

Lambda 的预留并发度达到了 10。

以 SQS 作为事件源的最大 Lambda 并发性

启动 SQS 作为事件源的最大并发性允许您控制每个源的 Lambda 函数并发性。您可以在事件源映射上设置最大并发度,而不是在 Lambda 函数上设置。

此事件源映射设置不会更改使用 SQS 的 Lambda 的扩展或批处理行为。您可以使用自定义的批量大小和窗口继续批处理消息。相反,它对每个 SQS 事件源的最大并发函数调用次数设置了限制。一旦 Lambda 扩展并达到在事件源上配置的最大并发度,Lambda 就会停止从队列中读取更多消息。当 Lambda 函数具有多个事件源时,此功能还使您可以灵活地定义单个事件源的最大并发性。

Maximum concurrency is set to 10 for the SQS queue.

SQS 队列的最大并发性设置为 10。

此功能可以帮助防止 Lambda 函数消耗账户的所有可用的 Lambda 并发性,并避免由于 Lambda 函数受到限制而导致消息不必要地返回到队列。它提供了一种以所需速度控制和使用消息的简便方法,由并发 Lambda 函数的最大数量控制。

最大并发设置不能取代现有的预留并发功能。两者都有不同的用途,这两个功能可以一起使用。最大并发性可以帮助防止下游系统不堪重负和不必要的限制调用。预留并发可保证函数的最大并发实例数。

组合使用时,Lambda 函数可以拥有自己的分配容量(预留并发性),同时能够控制每个事件源的吞吐量(最大并发性)。同时使用这两个功能时,必须将函数的预留并发设置为高于 SQS 事件源映射的最大并发性,以防止限制。

为作为事件源的 SQS 设置最大并发度

您可以通过 亚马逊云科技 管理控制台 、亚马逊云科技 命令行接口 (CLI) 或基础设施作为代码工具(如 亚马逊云科技 无服务器应用程序模型 (亚马逊云科技 SAM)) 配置 SQ S 事件源的最大并发度。 支持的最小值为 2,最大值为 1000。有关最新限制,请参阅 Lambda 配额 文档。

Configuring the maximum concurrency for an SQS trigger in the console

在控制台中配置 SQS 触发器的最大并发度

您可以通过 c reate-event-source-m apping 亚马逊云科技 CLI 命令设置最大并发度。

aws lambda create-event-source-mapping --function-name my-function --ScalingConfig {MaxConcurrency=2} --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue

查看最大并发设置的实际运行情况

以下演示比较了使用最大并发性与预留并发性相比,Lambda 接收和处理消息的方式有所不同。

这个 GitHub 存储库 包含一个 亚马逊云科技 SAM 模板,用于部署以下资源:

  • 预留并发队列(SQS 队列)
  • 预留并发死信队列(SQS 队列)
  • 预留并发函数(Lambda 函数)
  • 最大并发队列(SQS 队列)
  • 最大并发死信队列(SQS 队列)
  • 最大并发函数(Lambda 函数)
  • CloudWatch 控制面板(CloudW

亚马逊云科技 SAM 模板预置了两组相同的架构和一个 A mazon CloudWatch 控制面板来监控资源。每种架构都包含一个接收来自 SQS 队列的消息的 Lambda 函数,以及一个用于 SQS 队列的 DLQ。

SQS 队列的 maxReceiveCount 设置 为 1,它会将所有返回的消息直接发送到 DLQ。R eservedConcurrencyFunction 将其预留并发设置为 5,而 maxConconcurrencyFunction 将 SQS 事件源 的最大并发性设置 为 5。

先决条件

运行此演示需要 亚马逊云科技 CLI 和 A WS SAM CLI 。安装两个 CLI 后,克隆此 GitHub 存储库 并导航到该目录的根目录:

git clone https://github.com/aws-samples/aws-lambda-amazon-sqs-max-concurrency
cd aws-lambda-amazon-sqs-max-concurrency

部署 亚马逊云科技 SAM 模板

    1. 使用 构建 命令构建 亚马逊云科技 SAM 模板,为部署到您的 亚马逊云科技 环境做准备。
sam build
    1. 使用引导式 部署 命令在您的账户中部署资源。
sam deploy --guided
  1. 为堆栈命名并接受剩余的默认值。部署后,您可以通过 CLI 或导航到 亚马逊云科技 管理控制台 中的 亚马逊云科技 CloudFormation 页面 来跟踪进度。
  2. 记下 亚马逊云科技 SAM CLI、CloudFormation 控制台中 “ 输出 ” 选项卡中的队列网址,或者导航到 SQS 控制台查找队列网址。
The Outputs tab of the launched AWS SAM template provides URLs to CloudWatch dashboard and SQS queues.

已启动的 亚马逊云科技 SAM 模板的 “输出” 选项卡提供指向 CloudWatch 控制面板和 SQS 队列的 URL。

运行演示

部署的 Lambda 函数代码通过休眠 10 秒钟来模拟处理,然后返回 200 响应。这允许该函数在仅包含少量消息的情况下达到较高的函数并发数。

要向预留并发队列中添加 25 条消息,请运行以下命令。 替换为 亚马逊云科技 SAM 输出 中的队列 URL 。

for i in {1..25}; do aws sqs send-message --queue-url <ReservedConcurrencyQueueURL> --message-body testing; done 

要向最大并发队列中添加 25 条消息,请运行以下命令。 替换为 亚马逊云科技 SAM 输出 中的队列 URL 。

for i in {1..25}; do aws sqs send-message --queue-url <MaxConcurrencyQueueURL> --message-body testing; done 

向两个队列发送消息后,导航到 “ 输出 ” 选项卡中可用的控制板 URL 以查看 CloudWatch 控制面板。

验证结果

两个 Lambda 函数的调用次数相同,并发调用次数相同,固定为 5。CloudWatch 控制面板显示,R eservedConcurrencyFunction 遇到了限制,如右上角的指标所示,已向相应的 DLQ 发送了 9 条消息。 maxConconcurrencyFunction 没有遇到任何限制,消息也没有传送到 DLQ。

CloudWatch dashboard showing throttling and DLQs.

显示节流和 DLQ 的 CloudWatch 控制面板。

清理

要删除在此演示中创建的所有资源,请使用 删除 命令并按照提示进行操作:

sam delete

结论

现在,您可以控制 SQS 作为 Lambda 事件源调用的并发函数的最大数量。这篇文章解释了 Lambda 使用这种架构模式的扩展行为、该功能有助于解决的挑战,以及最大并发性的实际演示。

除了标准的 SQS 和 Lambda 费用外,使用此功能无需额外付费。通过将 SQS 与 SQS 连接起来,您可以开始使用 SQS 的最大并发性作为具有新事件源或现有事件源映射的事件源。此功能适用于所有可用 Lambda 的商业区域。

如需更多无服务器学习资源,请访问 无服务器世界


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。