【问题标题】:Can single consumer read from multiple partitions of a kafka topic?单个消费者可以从 kafka 主题的多个分区中读取吗?
【发布时间】:2021-11-28 19:52:37
【问题描述】:
有一个kafka topic有16个partition
使用给定的消费者组名称,我们目前正在启动单个消费者来读取主题。
-
单个消费者是否阅读该主题的partition 0(only)?
如果partition 0 的消息为空,消费者是否开始从下一个分区读取(partiton 1... 等等)?
-
我们可以选择启动多个消费者(具有相同的消费者组名称)来读取同一主题(具有 16 个分区)。可以维护多少个消费者,以并行读取多个分区?
【问题讨论】:
标签:
apache-kafka
kafka-topic
【解决方案1】:
你有一个包含 16 个分区的主题
使用给定的消费者组名称,您当前正在启动单个消费者以读取主题
这个单一消费者将从所有分区中读取数据。
因为您可以启动多个消费者(在同一个消费者组内)。
对于 16 个分区,您最多应该有 16 个消费者监听每个分区。在消费者组中的 Kafka 中,每个分区最多可以有 1 个消费者。
【解决方案2】:
组中的消费者通过确定每个分区仅由组中的单个消费者使用,在他们之间尽可能公平地划分主题分区。当消费者数量少于分区时,相同的消费者会从多个分区中读取消息。
在您的场景中,单个消费者将从您的所有分区中读取数据。这种类型的消费者被称为独家消费者。当消费者组只有一个消费者时,就会发生这种情况。这样的消费者必须连接到它需要的所有分区。
理想情况下,分区的数量应该等于消费者的数量。如果消费者数量更多,多余的消费者就会闲置,浪费客户资源。如果分区的数量更多,一些消费者会从多个分区读取,这应该不是问题,除非消息的顺序很重要。
订购
Kafka 不保证分区之间消息的顺序。它确实提供了分区内的排序。因此,如果消费者只订阅了一个分区,Kafka 可以为消费者维护消息排序。
如果您的用例中需要消息排序,则应使用处理期间分组依据的键对消息进行排序。