加入两个 KStreams 时需要 Kafka Streams Co-Partitioning

Kafka Streams Co-Partitioning is required while joining two KStreams

最近我开始阅读有关即将进行的项目的 Kafka 流,并偶然发现了一个概念,如果我们想加入两个流,则需要共同分区,我能理解的是如果我们有两个主题 A 和 B两者都必须具有相同数量的分区,对于键 'X' 来说,两个主题的分区号也必须相同。

分区为 A0、A1、A2 的主题 A 分区 B0、B1、B2 的主题 B

然后必须分别在 A0 和 B0 中发布带有密钥 'X' 的消息。

问题:为什么两个主题的分区号必须相同(对于 'X' 键),如果我们在两个主题中有相同​​数量的分区但一些分区空闲,即消息是,我们可能会遇到什么问题分区间分布不均。

当你做Kafka streaming的时候,会用到Kafka group consumer。因此,您的主题分区是根据 Kafka 分区策略分配的。默认是范围分配器。 read here 更多。

要加入两个流,具有相同密钥的两条消息应该在同一个消费者实例中可用。否则您的流媒体消费者无法找到其他消息加入。为确保这一点,两个主题的分区号应该相同,密钥也应该相同。

当两个主题的分区号相同时,Kafka Partitioning Range Assigner 确保将相同的分区分配给相同的实例。

这是kafka的视角。从应用程序方面,您的生产者应确保使用散列分区程序生成消息。这是默认设置。然后,如果两个主题的分区数相同,则散列确保相同的键应该转到两个主题的相同分区号。

Kafka streaming Co-Partitioning 这样做是为了确保您的主题没有这些东西。