了解Kafka流分区分配器

时间:2019-04-16 14:45:32

标签: java spring-boot apache-kafka apache-kafka-streams

我有两个主题,一个带有3个分区,一个带有48个分区。

最初,我使用默认分配器,但是当使用者(kubernetes中的pod)崩溃时,我遇到了一些问题。

发生的事情是,当吊舱再次出现时,它将主题的分区重新分配为3个分区,将主题的0重新分配为48个分区。

未崩溃的两个Pod从该主题分配了16个分区和32个分区,其中包含48个分区。

我已经通过使用循环分区分配器解决了这个问题,但是由于我使用的是kstream-kstream联接,因此现在我对分区的分配方式没有信心,为此,我们需要确保分配了使用者到所有消费者的相同分区,例如C1:(t1:p0,t2:p0)C2(t1:p1,t2:p1)等。

我想到的一件事是,我可以重新输入即将发生的事件,以便它们可以重新分区,然后我也许可以保证这一点?

或者也许我不明白默认分区的工作方式。我很困惑

1 个答案:

答案 0 :(得分:5)

Kafka Streams不允许使用自定义分区分配器。如果您自己设置,它将被StreamsPartitionAssignor [1]覆盖。需要这样做以确保在可能的情况下-在重新平衡期间将分区重新分配给相同的使用者(也称为粘性)。粘性对于Kafka Streams尽可能重用消费者方的状态存储很重要。如果未将分区重新分配给同一使用者,则在重新平衡后,需要从头重新创建该使用者中使用的状态存储。

[1] https://github.com/apache/kafka/blob/trunk/streams/src/main/java/org/apache/kafka/streams/StreamsConfig.java#L989