【问题标题】:How do co-partitioning ensure that partition from 2 different topics end up assigned to the same Kafka Stream Task?共同分区如何确保来自 2 个不同主题的分区最终分配给同一个 Kafka 流任务?
【发布时间】:2019-12-04 19:56:52
【问题描述】:
【问题讨论】:
标签:
apache-kafka
apache-kafka-streams
【解决方案1】:
我的理解是,我们有2个独立的consumer group,实际上可能同名,因为是同一个kafka stream应用,虽然每个topic的订阅是相互独立的。
一个消费者组的所有成员都有相同的“名称”(即group.id)——不可能有两个同名的消费者组。这将是一个消费者群体。
虽然每个主题的订阅是相互独立的
对于KafkaConsumer,组中的不同成员可以有不同的订阅(即使这应该是非常罕见的情况)。然而,对于 Kafka Streams,要求组的所有成员(即应用程序实例)使用确切的一些输入主题(即它们的订阅必须相同)执行确切的一些 Topology。
我不知道消费者对分区的分配可能与分区的内容有关。到目前为止,我虽然是随机的。
没错。
来自你自己的回答:
也就是说,如果partition的个数相同,并且topic的每个producer的partition策略相同,那么key相同的message会在partition range上以同样的方式分配,分配给消费者以相同的方式,即作为来自每个主题的分区的连续子集。因此,相同的流任务将始终具有具有相同键的两个主题的分区。
这也是正确的。
请注意,Kafka Streams 使用特殊的分区分配器(不是消费者提供的默认分区分配器)来确保共同分区、粘性(即状态存储感知)和分配备用任务。
【解决方案2】:
刷新后,我发现以下两条语句可以解释这一切:
A consumer group has a unique id. Each consumer group is a subscriber to one or more Kafka topics.
因此,一个消费者组可能涉及多个主题及其分区以及将它们分配给该组消费者的策略。
PARTITION.ASSIGNMENT.STRATEGY(在 Kafka 权威指南中)
PartitionAssignor 是一个类,给定消费者和他们订阅的主题,决定哪些分区将分配给哪个消费者。默认情况下,Kafka 有两种分配策略:
-
范围:从其订阅的每个主题中为每个消费者分配一个分区的连续子集。因此,如果消费者 C1 和 C2 订阅了两个主题 T1 和 T2,并且每个主题都有三个分区,那么 C1 将被分配来自主题 T1 和 T2 的分区 0 和 1,而 C2 将被分配来自这些主题的分区 2 .因为每个主题的分区数量不均匀,并且每个主题的分配都是独立完成的,所以第一个消费者最终得到的分区比第二个多。每当使用 Range 分配并且消费者数量没有整齐地划分每个主题中的分区数量时,都会发生这种情况。
也就是说,如果partition的个数相同,并且topic的每个producer的partition策略相同,那么key相同的message会在partition range上以同样的方式分配,分配给消费者以相同的方式,即作为每个主题的分区的连续子集。因此,相同的流任务将始终具有具有相同键的两个主题的分区。