Kinesis流/分片 - 多个消费者

8

我已经阅读了一些关于Kinesis shard和多个消费者的问题,但是我仍然不理解它是如何工作的。

我的用例:我有一个只有一个shard的Kinesis流。我想使用不同的Lambda函数来消费这个shard,每个函数都是独立的。就像每个Lambda函数都有自己的shard迭代器一样。

这是可能的吗?设置多个Lambda消费者(基于流)从同一流/ shard中读取?

5个回答

6

嘿,Magalhaes先生,我相信下面的图片可以回答你的一些问题。

Processing Streams: Lambda

因此,为了澄清,您可以将多个Lambda设置为kinesis流的消费者,但是这些Lambda在处理时会相互阻塞。如果您的流只有一个分片,则只有一个并发的Lambda。


很棒的可视化@Dave Webster!你有源链接吗? - killthrush
2
有没有办法让 Lambda 只处理来自一个特定分片的记录? - Jwan622
这已经不再正确了。现在,Kinesis具有“parallelizationFactor”,允许1到10个Lambda在同一分片上运行。这个答案应该被踩。 - Eduardo Elias Saléh

4
如果您拥有一个Kinesis流,您可以通过事件源映射连接任意数量的Lambda函数。所有函数将同时运行,并且完全独立于彼此,并且如果新记录到达流,则会不断地被调用。分片的数量并不重要。

3
对于单个 Lambda 函数: “处理 Kinesis 或 DynamoDB 流的 Lambda 函数的并发单位是分片数。如果您的流有 100 个活动分片,则最多会有 100 个 Lambda 函数调用同时运行。这是因为 Lambda 按顺序处理每个分片的事件。” [https://docs.aws.amazon.com/lambda/latest/dg/scaling.html]
但是,您可以连接无限数量的不同 Lambda 消费者到 Kinesis 上。

2
短答案:是的,它可以工作,并且可以同时工作。
长答案:Kinesis流中每个共享的内容具有2MiB /秒的读取吞吐量。您可以在以下链接中找到更多信息: https://docs.aws.amazon.com/streams/latest/dev/building-consumers.html 如果您有多个应用程序(在您的情况下为Lambda),它们将共享吞吐量。上面链接中描述如下:
“每个碎片的吞吐量固定为2 MiB / sec。如果有多个使用相同碎片的消费者,则它们都共享此吞吐量。它们从碎片接收的吞吐量总和不超过2 MiB / sec。”
如果您创建(写入)的数据少于1mib / sec,则可以使用单个碎片支持两个“应用程序”。
通常,如果您有Y个碎片和X个应用程序,则只要总写入吞吐量(mib / sec)小于2mib / sec * Y / X,并且数据在碎片之间平均分布,则它应该正常工作。
如果您需要每个“应用程序”使用2 Mib / sec,则可以启用“增强扇出”的“消费者”,这将“扇出”流,使每个应用程序获得专用的每个碎片2 Mib / sec吞吐量(而不是共享吞吐量)。
您可以在以下链接中找到更多信息: https://docs.aws.amazon.com/streams/latest/dev/introduction-to-enhanced-consumers.html 增强扇出是Amazon Kinesis Data Streams中的一项功能,它允许使用增强扇出的消费者从流中接收记录,每个碎片的吞吐量最高可达2 MiB /秒。这种吞吐量是专用的,这意味着使用增强扇出的消费者不必与从流中接收数据的其他消费者竞争。

1

没问题!

分片的数量并不限制一个流可以拥有的消费者数量。在您的情况下,它只会限制每个 Lambda 并发调用的数量。这意味着对于每个消费者,您只能拥有每个分片的并发执行数。

请参见this doc 获取更多详细信息。


2
对我来说还是不太明白。如果我只有一个分片,而多个函数从同一个分片中消费,那么它们不能同时运行,对吗?因此,当流上出现新记录时,Lambda 将一个接一个地被调用。 - p.magalhaes
1
@p.magalhaes 是的,你说得对。基本上,如果你只有一个分片,而且你不会为同一消费者拥有并行工作的 Lambda 函数。你必须足够快地消耗分片,不能有多个线程为同一消费者消耗相同的分片。可以参考这个例子:https://dev59.com/olsW5IYBdhLWcg3w4aX7#34509567。AWS Lambda 与 Kinesis 同样适用。 - SerhatCan
3
我认为这是错误的。当有新记录到达时,使用1个分片和2个不同的消费者将导致2个消费者同时被调用和运行。为了确保,我尝试了两个函数,每个函数在消息到达时持续100秒,结果这2个函数同时运行。 - DaMaill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接