在收听具有多个分区的主题时,如何确保 Kafka Streams 处理所有相关数据?
How to ensure for Kafka Streams when listening to topics with multiple partitions that all related data is processed?
我想知道 Kafka Streams 是如何分配给阅读的主题分区的。
据我了解,每个 Kafka Stream Thread 都是一个 Consumer(Stream 有一个 Consumer Group)。所以我猜消费者是随机分配给分区的。
但是,如果我有多个要加入的输入主题,它是如何工作的?
示例:
主题 P 包含人物。它有两个分区。消息的键是 person-id,所以属于一个人的每条消息总是在同一个分区中结束。
主题 O 包含订单。它有两个分区。可以说关键也是人的身份(订购东西的人的)。所以在这里,属于一个人的每个订单消息也总是在同一个分区中结束。
现在我有流,它从两个主题读取并计算每个人的所有订单并将其写入另一个主题(其中消息还包括人名)。
主题 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。
这意味着 订单 lasagne
对于 hans
永远不会被计算在内,因为对于那个流需要消耗 topic P 分区 1 和 topic O 分区 2.
那么如何处理这个问题呢?我想流需要以某种方式处理彼此相关的数据是相当普遍的。因此必须确保相关数据(此处:hans
和 lasagne
)由同一流处理。
我知道如果只有一个流或主题只有一个分区,则不会出现此问题。但是我希望能够并发处理消息。
谢谢
您的用例是 KStream-KTable join,其中 KTable 存储用户信息,KStream 是订单流,因此 2 个主题必须是 co-partitioned
,它们必须具有相同的分区号和分区通过相同的密钥和分区程序。如果您使用 person-id
作为 kafka 消息的键,并且使用相同的分区程序,您不必担心这种情况,因为它们位于相同的分区号上。
已更新:正如 Matthias 指出的那样,每个 Stream Thread 都有自己的 Consumer 实例。
我想知道 Kafka Streams 是如何分配给阅读的主题分区的。 据我了解,每个 Kafka Stream Thread 都是一个 Consumer(Stream 有一个 Consumer Group)。所以我猜消费者是随机分配给分区的。
但是,如果我有多个要加入的输入主题,它是如何工作的?
示例:
主题 P 包含人物。它有两个分区。消息的键是 person-id,所以属于一个人的每条消息总是在同一个分区中结束。
主题 O 包含订单。它有两个分区。可以说关键也是人的身份(订购东西的人的)。所以在这里,属于一个人的每个订单消息也总是在同一个分区中结束。
现在我有流,它从两个主题读取并计算每个人的所有订单并将其写入另一个主题(其中消息还包括人名)。
主题 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。
这意味着 订单 lasagne
对于 hans
永远不会被计算在内,因为对于那个流需要消耗 topic P 分区 1 和 topic O 分区 2.
那么如何处理这个问题呢?我想流需要以某种方式处理彼此相关的数据是相当普遍的。因此必须确保相关数据(此处:hans
和 lasagne
)由同一流处理。
我知道如果只有一个流或主题只有一个分区,则不会出现此问题。但是我希望能够并发处理消息。
谢谢
您的用例是 KStream-KTable join,其中 KTable 存储用户信息,KStream 是订单流,因此 2 个主题必须是 co-partitioned
,它们必须具有相同的分区号和分区通过相同的密钥和分区程序。如果您使用 person-id
作为 kafka 消息的键,并且使用相同的分区程序,您不必担心这种情况,因为它们位于相同的分区号上。
已更新:正如 Matthias 指出的那样,每个 Stream Thread 都有自己的 Consumer 实例。