首页 > 解决方案 > Kafka Streams 如何分配分区?

问题描述

我有一个 Kafka Streams 应用程序,它从 topic-1 asKStream和 topic-2 as接收数据KTable。两个主题各有 4 个分区。假设我有 4 个应用程序实例正在运行,那么每个实例都会从 topic-1 的单个分区接收数据。收到的 topic-2 怎么样KTable?在这种情况下,所有实例都会从所有 4 个分区接收数据吗?如果两个主题的关键字相同,那么我猜 Kafka Streams 将确保为应用程序分配相同的分区。如果 topic-2 没有任何键,而是应用程序从值本身推断,那么这意味着所有实例都需要从 topic-2 获取所有分区。Kafka Streams 如何处理这种情况?

谢谢!

标签: apache-kafka-streams

解决方案


KTables根据输入分区进行分片。因此,与 a 类似KStream,每个实例将分配一个主题分区并将该主题分区具体化为KTable. Kafka Streams 确保不同主题的主题分区位于同一位置,即一个实例将被分配topic-1 partition-0topic-2 partition-0(等等)。

如果topic-2没有键集,数据将随机分布在主题中。对于这种情况,您可以使用 aGlobalKTable代替。AGlobalKTable是每个实例的所有分区的完整复制。如果你做一个KStream-GlobalKTable-join,你可以指定一个从表中提取连接属性的“映射器”(即,你可以从值中提取连接属性)。

注意:KStream-GlobalKTable 连接与 KStream-KTable 连接具有不同的语义。与后者相比,它不是时间同步的,因此,对于 GlobalKTable 更新,连接在设计上是不确定的;即,不能保证哪个 KStream 记录将首先“看到” GlobalKTable 更新并因此加入更新的 GlobalKTable 记录。


推荐阅读