为什么这个 Lambda 函数没有运行更多并发执行?

问题描述 投票:0回答:1

我有一个连接到 AWS Kinesis 数据流的 AWS Lambda 函数。最近流中的数据量显着增加,但 Lambda 函数的并发执行数量却没有增加。 “并发执行数”始终徘徊在 2-3 左右,尽管您可以看到迭代器在队列中备份了相当多的记录等待处理: (https://i.sstatic.net/wdBhSgY8.png)

我尝试使用 4 个 Kinesis 分片 + 每个分片 10 个并行执行来设置此 Lambda 函数/Kinesis 流,甚至尝试在 Lambda 中配置 10 个并发。尽管如此,它永远不会超过 3 个并发执行。

AWS 文档这里 说: “例如,当您将 ParallelizationFactor 设置为 2 时,最多可以有 200 个并发 Lambda 调用来处理 100 个 Kinesis 数据分片(尽管在实践中,您可能会看到 ConcurrentExecutions 指标的不同值)。”为什么“在实践中”我们可能会看到并发执行的不同值?为什么我的卡在2-3?

我确信我只是无法理解一些基本的 Lambda 概念,但我在任何地方都找不到好的解释。触发 Lambda 一次运行多个并发执行的变量是什么?如何让我的 Lambda 函数运行更多并发执行?

有关我的 Lambda 函数和 Kinesis 流的详细信息:

Lambda 函数是 Python 3.9 函数

https://i.sstatic.net/zOiRUoq5.png

https://i.sstatic.net/bmO5z6cU.png

https://i.sstatic.net/Yub4Vjx7.png

https://i.sstatic.net/ZfI7N4mS.png

amazon-web-services aws-lambda amazon-kinesis
1个回答
0
投票

通过进一步研究,我确定 Kinesis 分片数量和并发 Lambda 执行的限制变量是 Kinesis 流中的分区键数量。

具有相同分区键的所有记录将始终进入同一个 Kinesis 分片。因此,即使您有 100 个分片,如果您的记录中有 1 个分区键,那么您也只会使用 1 个分片。即使您的数据超出了该分片的容量,Kinesis 也不会使用另一个分片。

同样,Lambda 拒绝同时处理具有相同分区键的多批记录,以维持流中事件的正确顺序。如果 Lambda 同时处理 100 批具有相同分区键的记录,它就无法再保证以正确的顺序处理它们。

因此,考虑到一个分区键的所有记录都进入同一个 Kinesis 分片,并且 Lambda 永远不会同时执行同一分区键的多个批次,那么我们可能会想:为什么有一个“每个分片并发执行数”的设置拉姆达?答案是多个不同的分区键都可以转到单个 Kinesis 分片。例如,您的传入数据中可以有 3 个不同的分区键,并且如果数据量足够小(例如小于 1,000 MB/秒),则具有这 3 个分区键的所有记录都可以转到相同的 Kinesis 分片。然后,由于 Lambda 可以同时处理不同的分区键,因此它将为每个 1 个分片运行 3 个并发批次(该分片上的每个分区键一个)。

总之,要在 Lambda 中运行并发执行,您必须在传入数据中指定多个不同的分区键。同样,要在 Kinesis 中使用多个分片,您必须使用不同的分区键并超过第一个分片的容量。

在我的示例中,我从大约 100 个不同的服务器接收传入数据,因此我将把服务器 ID 等内容附加到分区键中,以便每个服务器都有一个唯一的分区键。现在,Lambda 将同时处理所有 100 台服务器的事件。

分区键告诉 Kinesis/Lambda,“具有此分区键的每条记录都是一个唯一的事件队列;请将这些记录写入同一个 Kinesis 分片,并且切勿在 Lambda 中同时运行它们,从而保持这些记录的顺序”。如果您想要并发处理和多个分片,请为每个事件队列指定不同的分区键。

以下答案综合在一起后,提供了回答我的问题所需的信息:

AWS Kinesis 中的分区键是什么?

并行化因子:AWS Kinesis 数据流传输至 Lambda

© www.soinside.com 2019 - 2024. All rights reserved.