每个运动分片有多个消费者

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

我听说每个 kinesis 流可以有多个消费者应用程序。

http://docs.aws.amazon.com/kinesis/latest/dev/developing-consumers-with-kcl.html

但是,我听说每个分片只能有一个消费者。这是真的?我没有找到任何文档来支持这一点,并且无法想象如果多个消费者从同一个流中读取数据会怎样。当然,这并不意味着生产者需要在不同的分片中为不同的消费者重复内容。

sharding consumer amazon-kinesis
3个回答
24
投票

Kinesis 客户端库在后台启动线程,每个线程监听流中的 1 个分片。您无法通过多个线程连接到分片,这是设计使然。

http://docs.aws.amazon.com/kinesis/latest/dev/kinesis-record-processor-scaling.html

例如,如果您的应用程序在一个 EC2 实例上运行,并且 正在处理一个具有四个分片的 Amazon Kinesis 流。这个 实例有 1 个 KCL 工作线程和 4 个记录处理器(1 个记录处理器) 每个分片的处理器)。这四个记录处理器运行在 同一进程内并行。

在上面的解释中,术语“KCL 工作人员”是指 Kinesis 消费者应用程序。不是线程。

但在下面,相同的“KCL Worker”术语指的是应用程序中的“Worker”线程;这是一个可运行的。

通常,当您使用 KCL 时, 您应该确保实例的数量不超过 分片数量(故障备用目的除外)。每个分片都是 由恰好一名 KCL 工作人员处理并且恰好有一个对应的 记录处理器,因此您永远不需要多个实例来处理一个 碎片。

请参阅 KCL 源代码中的 Worker.java 类。


22
投票

晚了,但答案是你可以每个运动分片有多个消费者。一个 KCL 实例只会为每个分片启动一个进程,但您可以让另一个 KCL 实例使用相同的流(和分片),假设第二个实例具有权限。

但是,正如

文档中所述,存在一些限制,包括:

每个分片每秒最多支持 5 个事务读取,最大总数据读取速率为每秒 2 MB。

如果您想要一个具有多个消费者的流,其中每条消息都将被处理一次,那么您最好使用

Amazon Simple Queue Service 之类的东西。


1
投票
为了简单起见,您可以在 kinesis 数据上触发多个/不同的 lambda 函数。这样你的两个 lambda 都将从运动中获取所有数据。缺点是现在您必须增加运动级别的吞吐量,这将是昂贵的。对于您的用例,请使用 SQS。

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