我很好奇 kafka 是否默认在消费者组内进行共同分区,或者这是否是 kafka-streams 添加的功能。
例如:假设我有一个消费者组
group-1
,该组消费主题 A
和 B
,这两个主题都有 10 个分区。如果我使用相同的密钥 A
向 B
和 ID-1
生成记录,我是否可以保证包含带有 A
的条目的 B
和 ID-1
的分区将位于同一服务器上实例?
谢谢!
共同分区涉及数据如何跨分区分布; Kafka 不直接管理键,它只知道分区。假设相同的密钥将始终进入相同的分区(这取决于 Kafka Producer 中使用的
partitioner.class
,默认值正是这样做的)。
在消费者方面,共同分区受
partition.assignment.strategy
的影响。默认设置为 range
。当消费具有相同分区数且键分区一致的主题时,每个消费者组成员将处理相同的分区号(所有 p0、所有 p1 等),从而使共同分区有效。
例如,使用 round-robin
作为
partition.assignment.strategy
会使共同分区无效。当使用具有不同分区数量的多个主题,并且您希望在消费者实例之间均匀分配分区消耗时(其中
range
将在消费者之间创建不均匀的分区分配),可以使用此方法。这就是为什么 Kafka Streams 可以对主题进行重新分区,以确保相同数量的分区通过共同分区来处理数据。