Java 理解kafka流分区赋值器

Java 理解kafka流分区赋值器,java,spring-boot,apache-kafka,apache-kafka-streams,Java,Spring Boot,Apache Kafka,Apache Kafka Streams,我有两个主题,一个有3个分区,一个有48个分区 最初我使用默认的赋值器,但当消费者(kubernetes中的pod)崩溃时,我遇到了一些问题 发生的事情是,当pod再次出现时,它重新分配了主题中的3个分区和主题中的0个48个分区 没有崩溃的两个pod从主题中获得了16个和32个分区,共有48个分区 我已经通过使用循环分区赋值器解决了这个问题,但现在我对分区的分布方式没有信心,因为我使用的是kstream kstream连接,为此,我们需要确保为所有使用者将使用者分配到相同的分区,例如C1:(t1

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

最初我使用默认的赋值器,但当消费者(kubernetes中的pod)崩溃时,我遇到了一些问题

发生的事情是,当pod再次出现时,它重新分配了主题中的3个分区和主题中的0个48个分区

没有崩溃的两个pod从主题中获得了16个和32个分区,共有48个分区

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

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


或者我不明白默认分区是如何工作的。。im混乱

Kafka Streams不允许使用自定义分区赋值器。如果您自己设置一个,它将被
StreamsPartitionAssignor
[1]覆盖。如果可能的话,这是为了确保在重新平衡期间分区被重新分配给相同的使用者(也称为粘性)。粘性对于Kafka Streams能够尽可能多地重用消费者端的状态存储非常重要。如果未将分区重新分配给同一使用者,则需要在重新平衡后重新创建此使用者内使用的状态存储


[1]

实际上,Kafka Streams不允许使用自定义分区赋值器。您的自定义分区赋值器可能被忽略。此外,根据Kafka Streams,连接的输入主题(左侧和右侧)必须具有相同数量的分区。好的,因此我考虑合并这些流,然后执行一个流。通过(newTopic)将数据流合并为一个主题,其中包含3个分区,然后我将把它们过滤成两个流,然后进行连接?你觉得这个主意怎么样?我想到的另一个解决方案是创建一个微服务,只将消息转发到一个主题,然后将它们过滤到两个新的kstream并进行连接。。还有更好的主意吗?还有分区赋值器,当涉及到kstreams时,没有办法改变这一点?您似乎可以在这里找到答案:@dmvkl:您链接到的线程涉及如何自定义生产者端的分区器以及消费者端的默认分区赋值器如何工作。然而,这里的问题是关于自定义分区赋值器的。@kambo,类似的问题再次感谢。在应用程序内部更改关键点时,应用程序和卡夫卡将如何运行。到目前为止,我看到的是正在进行一些重新划分。它在我不想要的负载下沉重地记录下来。但这是否意味着坏消息?记录会在密钥更改操作和基于密钥的操作之间重新分区。例如,一个
映射
,它输出一个新键,后跟一个
groupByKey
。请参见
groupByKey