我想知道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。
那么如何处理这个问题呢?我想流需要以某种方式处理相互关联的数据是很常见的。因此,必须确保相关数据(此处:hans
和lasagne
(由相同的流处理。
我知道如果只有一个流或者主题只有一个分区,就不会出现这个问题。但是我希望能够同时处理消息。
感谢
您的用例是一个KStream-KTable联接,其中KTable存储Users的信息,KStream是Order的流,因此这两个主题必须是co-partitioned
,它们必须具有相同的分区号,并由相同的键和Partitioner进行分区。如果您使用person-id
作为kafka消息的密钥,并且使用相同的Partitioner,则不必担心这种情况,因为它们位于相同的分区号上。
更新:正如Matthias所指出的,每个流线程都有自己的Consumer实例。