如何确保Kafka Streams在侦听具有多个分区的主题时处理所有相关数据



我想知道Kafka Streams是如何分配给主题分区进行阅读的。据我所知,每个Kafka流线程都是一个消费者(流有一个消费者组(。所以我猜消费者是随机分配给分区的。

但是,如果我有多个输入主题要加入,它是如何工作的呢?

示例:

主题p包含人物。它有两个分区。消息的密钥是个人id,因此属于一个人的每条消息总是在同一个分区中结束。

主题O包含订单。它有两个分区。比方说,密钥也是(订购东西的人的(个人id。因此,在这里,每个属于一个人的订单消息总是在同一个分区中结束。

现在我有了stream,它从两个主题中读取并统计每个人的所有订单,并将其写入另一个主题(其中消息还包括个人的姓名(。

主题p中的数据:

分区1"hans, id=1""maria, id=3"

分区2:"john, id=2"

主题O中的数据:

分区1"person-id=2, pizza""person-id=3, cola"

分区2"person-id=1, lasagne"

现在我开始了两条流。

然后可能发生这种情况:

流1被分配给主题p分区1标题O分区1

流2被分配给主题p分区2标题O分区2

这意味着hans的顺序lasagne永远不会被计数,因为为此流需要消耗主题p分区1标题O分区2

那么如何处理这个问题呢?我想流需要以某种方式处理相互关联的数据是很常见的。因此,必须确保相关数据(此处:hanslasagne(由相同的流处理。

我知道如果只有一个流或者主题只有一个分区,就不会出现这个问题。但是我希望能够同时处理消息。

感谢

您的用例是一个KStream-KTable联接,其中KTable存储Users的信息,KStream是Order的流,因此这两个主题必须是co-partitioned,它们必须具有相同的分区号,并由相同的键和Partitioner进行分区。如果您使用person-id作为kafka消息的密钥,并且使用相同的Partitioner,则不必担心这种情况,因为它们位于相同的分区号上。

更新:正如Matthias所指出的,每个流线程都有自己的Consumer实例。

相关内容

  • 没有找到相关文章

最新更新