每个 kinesis 分片有多个消费者

Posted

技术标签:

【中文标题】每个 kinesis 分片有多个消费者【英文标题】:multiple consumers per kinesis shard 【发布时间】:2016-04-02 21:01:00 【问题描述】:

我了解到,每个 kinesis 流可以有多个消费者应用程序。

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

我现在明白了。在这种情况下,即使有多个实例,它们也是同一个客户端应用程序。我想沿着 kafka 的路线,独立的应用程序可以从单个流中读取。 @user1058511:你可以。 Kinsis 支持多个应用程序同时使用同一流的用例。例如,您有一个更新实时仪表板的应用程序和另一个存档数据的应用程序。您希望两个应用程序同时且独立地使用来自同一流的数据。 我想我需要重新措辞。在 Kafka 的情况下,多个消费者应用程序可以参与到一个消费者组中,从而不会重复处理任何一条消息。从这个意义上说,我不想说“独立”,因为假设是“分离”。【参考方案2】:

迟到了,但答案是您可以在每个 kinesis 分片上有多个消费者。一个 KCL 实例每个分片仅启动一个进程,但假设第二个 KCL 实例具有权限,您可以让另一个 KCL 实例使用相同的流(和分片)。

不过,如the docs 所述,有一些限制,包括:

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

如果您想要一个包含多个消费者的流,其中每条消息将被处理一次,您可能最好使用Amazon Simple Queue Service 之类的东西。

【讨论】:

我会将“处理一次”编辑为“至少处理一次”。在 SQS 中,您不能保证一条消息会被处理一次。您将至少获得一次处理:***.com/questions/37472129/… 两个 KCL 实例会获得相同的数据还是会例如跨 EC2 实例“循环”数据?我正在寻找一种解决方案,其中 Kinesis Data Stream 的使用者不断运行,而无需等待另一台服务器在出现故障时启动(例如,让两台服务器始终运行,但避免两次处理记录)跨度> 每个消费者获得相同的数据(由其检查点管理),并且可以以他们想要的任何速率消费它,彼此独立,类似于拥有两个迭代器。它们仅与它们的组合读取限制相结合。这就是 Kinesis 与 AWS SQS(实际上只有一个迭代器)的行为不同的地方。

以上是关于每个 kinesis 分片有多个消费者的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kinesis 客户端库 (KCL 2.x) 的多个使用者到 Kinesis Stream

如何确定 AWS kinesis 流中的分区键总数?

Amazon Kinesis Streams - 每个分片有多个“主题”?

kafka分片和消费组的概念

有没有办法限制 Kinesis Consumer 的速率?

Kafka分布式消息系统剖析