【问题标题】:Does Kafka Streams library kill idle StreamThreads?Kafka Streams 库是否会杀死空闲的 StreamThreads?
【发布时间】:2021-09-06 21:49:48
【问题描述】:

说,KStream 拓扑很简单:输入主题 -> 流程 -> 输出主题。输入主题的分区 = 4。

如果有单个应用实例以num.stream.threads=4 运行,则使用所有 4 个 StreamThread。

如果启动第二个实例(使用num.stream.threads=4),流任务现在在两者之间分配。第一个实例上的任务 0_1 和 0_2,第二个实例上的任务 0_3 和 0_4。

在第一个实例中,kafka 流库是否会杀死目前正在运行 0_3 和 0_4 的线程?

【问题讨论】:

  • Kafka-Streams 不会杀死空闲的流线程,线程仍在运行,但没有任何活动的分配任务。您可以从日志、VisualVM 等线程分析器或使用 kafka-consumer-groups 中看到。从日志中您可以看到以下内容:1) 对于分配了分区的线程:Handle new assignment with: New active tasks: [0_1],2) 对于没有分配的线程 - Handle new assignment with: New active tasks: []
  • @VasylSarzhynskyi 是的,我得出了同样的结论,但我希望 Kafka 有一些策略可以稍后关闭它们。否则,随着更多实例的创建,空闲线程也会越来越多。这迫使开发人员随着实例数量的增加指定不同的线程数,这意味着应用程序必须了解环境。
  • 我明白你的担忧,但对我来说,随着应用实例数量的增加更新num.stream.threads(这是唯一的配置,无需更改代码)是合乎逻辑的

标签: apache-kafka apache-kafka-streams


【解决方案1】:

当输入主题只有 4 个分区时,当使用 num.stream.threads=1 启动 8 实例时会发生什么?

4 个实例变得空闲但未被杀死。如果任何其他已分配的实例出现故障,它们将保留并获得分配任务。

因此,当您在一个实例中启动多个踏板时,也会发生同样的事情。在您的情况下,2 个实例中的 8 个踏板,每个实例 4 个。同样的情况发生,我将在上面解释。您的 4 个线程变得空闲并保持空闲,直到它通过关闭其他实例来获取任务。

更多参考:

举个例子吧。想象一下您的应用程序正在从输入中读取 有 5 个分区的主题。我们可以在这里运行多少个应用实例?

简短的回答是,我们最多可以运行 5 个这样的实例 应用程序,因为应用程序的最大并行度是 5。如果我们 运行超过 5 个应用程序实例,那么“多余”的应用程序实例将 成功启动但保持空闲。如果其中一个繁忙的实例发生 下来,其中一个空闲实例将恢复前者的工作。

您可以通过参考this设置指标查看更多线程信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多