我们使用机器学习技术将英文博客翻译为简体中文。您可以点击导航栏中的“中文(简体)”切换到英文版本。
在使用亚马逊 SQS 作为事件源时引入 亚马逊云科技 Lambda 函数的最大并发性
这篇博客文章由解决方案架构师 John Lee 和 Jeetendra Vaidya 撰写。
这篇文章介绍在使用 SQS 作为 Lambda 的事件源时如何设置 SQS 触发器的最大并发度。它还概述了使用这种架构模式的 Lambda 扩展行为、该功能有助于解决的挑战以及最大并发功能的演示。
概述
Lambda 使用
Lambda 与
对于
挑战
当 SQS 队列中有大量消息时,Lambda 会向外扩展,添加其他函数来处理消息。向外扩展可能会消耗账户中的并发配额。为了防止这种情况发生,您可以 为单个 Lambda 函数设置
当 Lambda 函数的并发性达到预留的并发限制时,队列配置会指定后续行为。消息将返回到队列并根据重新驱动策略重试,根据其保留策略过期,或者发送到另一个
以下示例显示 Lambda 函数达到其预留并发配额 10。
以 SQS 作为事件源的最大 Lambda 并发性
启动 SQS 作为事件源的最大并发性允许您控制每个源的 Lambda 函数并发性。您可以在事件源映射上设置最大并发度,而不是在 Lambda 函数上设置。
此事件源映射设置不会更改使用 SQS 的 Lambda 的扩展或批处理行为。您可以使用自定义的批量大小和窗口继续批处理消息。相反,它对每个 SQS 事件源的最大并发函数调用次数设置了限制。一旦 Lambda 扩展并达到在事件源上配置的最大并发度,Lambda 就会停止从队列中读取更多消息。当 Lambda 函数具有多个事件源时,此功能还使您可以灵活地定义单个事件源的最大并发性。
此功能可以帮助防止 Lambda 函数消耗账户的所有可用的 Lambda 并发性,并避免由于 Lambda 函数受到限制而导致消息不必要地返回到队列。它提供了一种以所需速度控制和使用消息的简便方法,由并发 Lambda 函数的最大数量控制。
最大并发设置不能取代现有的预留并发功能。两者都有不同的用途,这两个功能可以一起使用。最大并发性可以帮助防止下游系统不堪重负和不必要的限制调用。预留并发可保证函数的最大并发实例数。
组合使用时,Lambda 函数可以拥有自己的分配容量(预留并发性),同时能够控制每个事件源的吞吐量(最大并发性)。同时使用这两个功能时,必须将函数的预留并发设置为高于 SQS 事件源映射的最大并发性,以防止限制。
为作为事件源的 SQS 设置最大并发度
您可以通过
您可以通过 c
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 接收和处理消息的方式有所不同。
这个
- 预留并发队列(SQS 队列)
- 预留并发死信队列(SQS 队列)
- 预留并发函数(Lambda 函数)
- 最大并发队列(SQS 队列)
- 最大并发死信队列(SQS 队列)
- 最大并发函数(Lambda 函数)
- CloudWatch 控制面板(CloudW
亚马逊云科技 SAM 模板预置了两组相同的架构和一个 A
SQS 队列的 maxReceiveCount 设置 为 1,它会将所有返回的消息直接发送到 DLQ。R eservedConcurrencyFunction 将其预留并发设置为 5,而 maxConconcurrencyFunction 将 SQS 事件源 的最大并发性设置 为 5。
先决条件
运行此演示需要
git clone https://github.com/aws-samples/aws-lambda-amazon-sqs-max-concurrency
cd aws-lambda-amazon-sqs-max-concurrency
部署 亚马逊云科技 SAM 模板
-
- 使用
构建 命令构建 亚马逊云科技 SAM 模板,为部署到您的 亚马逊云科技 环境做准备。
- 使用
sam build
-
- 使用引导式
部署 命令在您的账户中部署资源。
- 使用引导式
sam deploy --guided
- 为堆栈命名并接受剩余的默认值。部署后,您可以通过 CLI 或导航到 亚马逊云科技 管理控制台 中的
亚马逊云科技 CloudFormation 页面 来跟踪进度。 - 记下 亚马逊云科技 SAM CLI、CloudFormation 控制台中 “ 输出 ” 选项卡中的队列网址,或者导航到 SQS 控制台查找队列网址。
运行演示
部署的 Lambda 函数代码通过休眠 10 秒钟来模拟处理,然后返回 200 响应。这允许该函数在仅包含少量消息的情况下达到较高的函数并发数。
要向预留并发队列中添加 25 条消息,请运行以下命令。
for i in {1..25}; do aws sqs send-message --queue-url <ReservedConcurrencyQueueURL> --message-body testing; done
要向最大并发队列中添加 25 条消息,请运行以下命令。
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。
清理
要删除在此演示中创建的所有资源,请使用
sam delete
结论
现在,您可以控制 SQS 作为 Lambda 事件源调用的并发函数的最大数量。这篇文章解释了 Lambda 使用这种架构模式的扩展行为、该功能有助于解决的挑战,以及最大并发性的实际演示。
除了标准的 SQS 和 Lambda 费用外,使用此功能无需额外付费。通过将 SQS 与 SQS 连接起来,您可以开始使用 SQS 的最大并发性作为具有新事件源或现有事件源映射的事件源。此功能适用于所有可用 Lambda 的商业区域。
如需更多无服务器学习资源,请访问
*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。