KafkaStreams:源主题的任务数和正则表达式
KafkaStreams : Number of tasks and regex for source topics
假设我们有一个 KafkaStreams 应用程序,它正在从 2 个源主题 customerA.orders 和 customerB.orders 读取数据。每个主题有 3 个分区。
StreamsBuilder builder = new StreamsBuilder();
KStream stream1 = builder.stream("customerA.orders")
KStream stream2 = builder.stream("customerB.orders")
//Business logic which has stateless transformations.
当我 运行 这个应用程序时,预计会创建 6 个任务(因为每个主题有 3 个分区):当前活动任务:[0_0、0_1、 1_0、0_2、1_1、1_2]
由于两个主题名称都以“.orders”结尾,我可以使用正则表达式从源主题中读取数据,如下所示
StreamsBuilder builder = new StreamsBuilder();
KStream stream1 = builder.stream(Pattern.compile(".*orders"))
但是当我 运行 这个应用程序使用正则表达式时,即使我们有 2 个主题,每个主题有 3 个分区,也只创建了 3 个任务而不是 6 个任务:当前活动任务:[0_0, 0_1, 0_2]
streams 应用程序正在从这两个主题获取消息。
当我们对源主题使用正则表达式时,为什么任务数量会减少?
- 在第一个代码中,如果您不应用任何操作,如加入,或在两个主题之间使用相同的状态存储(更准确地说是在来自两个 KStreams 的 Stream DSL 代码之间),它将创建 2 个子拓扑,因此您可以为每个主题的分区分配单独的任务。所以这 2 个 Topology 并行处理。
- 当您的应用程序将多个主题订阅到一个 KStream 时,它将为具有相同分区号的输入主题的主题分区创建相同的任务,因此它是共同分区的(因此主题 1 的分区 0 和主题 1 的分区 0主题 2 由同一任务使用),并且一个特定任务一次仅处理来自订阅的分区 i 之一的一条消息。
假设我们有一个 KafkaStreams 应用程序,它正在从 2 个源主题 customerA.orders 和 customerB.orders 读取数据。每个主题有 3 个分区。
StreamsBuilder builder = new StreamsBuilder();
KStream stream1 = builder.stream("customerA.orders")
KStream stream2 = builder.stream("customerB.orders")
//Business logic which has stateless transformations.
当我 运行 这个应用程序时,预计会创建 6 个任务(因为每个主题有 3 个分区):当前活动任务:[0_0、0_1、 1_0、0_2、1_1、1_2]
由于两个主题名称都以“.orders”结尾,我可以使用正则表达式从源主题中读取数据,如下所示
StreamsBuilder builder = new StreamsBuilder();
KStream stream1 = builder.stream(Pattern.compile(".*orders"))
但是当我 运行 这个应用程序使用正则表达式时,即使我们有 2 个主题,每个主题有 3 个分区,也只创建了 3 个任务而不是 6 个任务:当前活动任务:[0_0, 0_1, 0_2]
streams 应用程序正在从这两个主题获取消息。
当我们对源主题使用正则表达式时,为什么任务数量会减少?
- 在第一个代码中,如果您不应用任何操作,如加入,或在两个主题之间使用相同的状态存储(更准确地说是在来自两个 KStreams 的 Stream DSL 代码之间),它将创建 2 个子拓扑,因此您可以为每个主题的分区分配单独的任务。所以这 2 个 Topology 并行处理。
- 当您的应用程序将多个主题订阅到一个 KStream 时,它将为具有相同分区号的输入主题的主题分区创建相同的任务,因此它是共同分区的(因此主题 1 的分区 0 和主题 1 的分区 0主题 2 由同一任务使用),并且一个特定任务一次仅处理来自订阅的分区 i 之一的一条消息。