当要加入的数据可以分配到不同的机器上时,Kafka 流如何执行联接?



有两个 Kafka 主题,每个主题有两个分区。他们的消息由相同的参数 id 键控:整数。

我有两个 Kafka Streams 应用程序的实例,因此每个实例都会为每个主题分配两个分区(任务(。

现在,假设主题 A 中的消息 ID = 1 的分区分配给 KStreams 应用程序实例 A,主题 B中的消息 ID = 1 的分区分配给应用程序实例 B,如果主题中的数据可能未并置(就像本例中键/ids=1 发生的那样(,这两个 KStreams 的连接如何工作?

有一些方法可以做到这一点...如果存储不是问题或频率,如果消息较低,则可以将 GlobalKtables 用于其中一个主题。这将花费更多内存,因为所有分区都将在 Streams 应用程序的所有实例上同步。

https://docs.confluent.io/current/streams/concepts.html#globalktable

另一种方法是使用 Kafka 流交互式查询来发现其他流实例上的数据。

https://kafka.apache.org/10/documentation/streams/developer-guide/interactive-queries.html

对于 KStreams 联接 - 您需要为两个主题提供相同数量的分区以及相同的分区策略。这样,所有使用者都将以相同的方式读取两个主题的分区。

不错的参考 分区博客 - https://medium.com/@anyili0928/what-i-have-learned-from-kafka-partition-assignment-strategy-799fdf15d3ab

最新更新