Kafka Streams 如何分配分区?

sob*_*cko 5 apache-kafka-streams

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

谢谢!

Mat*_*Sax 5

KTables根据输入分区进行分片。因此,与 类似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 记录连接。