【问题标题】:KafkaStreams : Number of tasks and regex for source topicsKafkaStreams:源主题的任务数和正则表达式
【发布时间】:2020-07-29 09:16:08
【问题描述】:

假设我们有一个 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 应用程序正在从两个主题中获取消息。

当我们对源主题使用正则表达式时,为什么任务数量会减少?

【问题讨论】:

    标签: apache-kafka-streams


    【解决方案1】:
    1. 在第一个代码中,如果您不应用任何操作,如加入,或在两个主题之间使用相同的状态存储(更准确地说,在来自两个 KStream 的流 DSL 代码之间),它将创建 2 个子拓扑,因此您每个主题的分区可以有单独的任务。所以这 2 个 Topology 过程是并行的。
    2. 当您的应用程序将多个主题订阅到一个 KStream 中时,它将为具有相同分区号的输入主题的主题分区创建相同的任务,因此它是共同分区的(因此主题 1 的分区 0 和主题 2 的分区 0由同一个任务使用),并且一个特定任务一次只处理来自订阅分区 i 之一的一条消息。

    【讨论】:

    • 当我们使用正则表达式订阅多个主题时,我们如何扩展?我想在这里使用正则表达式来避免在添加具有相同命名模式的新主题时重新构建和重新部署我的流应用程序。如果我继续添加更多主题,比如 customerC.orders、customersD.orders 等,每个都有 3 个分区,那么我最终只有 3 个任务(最大)处理所有这些主题。如何处理这种情况?
    • 目前您无法使用 reg-ex 订阅进行横向扩展。这是一个已知的限制。
    • @kartik Matthias 是对的,您可以通过传递主题列表添加环境或数据库中的配置来避免更改应用程序,并遍历主题列表并为每个主题构建每个 KStream,但您仍然必须重新启动您的应用程序
    • 仅供参考:issues.apache.org/jira/browse/KAFKA-9282 - 使用模式订阅时有关缩放的票
    猜你喜欢
    • 2023-03-12
    • 2015-01-04
    • 2011-06-23
    • 2021-02-17
    • 1970-01-01
    • 2019-07-02
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多