Kafka Streams 线程模型在同一实例和 JVM 上具有多个流

Kafka Streams Threading Model with more than one Stream on the same instance and JVM

您好,我正在尝试对 kafka 流线程模型有更多的了解,我正在查看 confluent 文档中的这个示例 https://docs.confluent.io/current/streams/architecture.html#example

我知道这个例子是针对单个 'kafka streams app' 的,在第一个图中,它部署在一台机器上并允许使用两个线程(可配置)。它在两个线程之间分裂,导致 3 个独立的 'tasks',我认为,它们彼此做同样的事情,它们只是并行化。这么多我想我明白了。

我的问题是,如果我在同一台机器和同一 jvm 中部署第二个完全不同的 'kafka streams app',它有自己唯一的客户端 ID,会怎样。第二个 kafka 流应用程序是否能够使用与第一个相同的两个(共享)线程,或者第一个流是否独占它被允许使用的线程。

另一种询问方式可能是所需的最小线程数,等于机器上单独的 Kafka 流应用程序的数量 运行?

线程由 KafkaStreams 个实例拥有。因此,如果您创建并启动多个 KafkaStreams,每个实例都有自己的线程——它们不是共享的。

顺便说一句:任务数与 KafkaStreams 实例数和线程数无关。任务的数量取决于输入主题的分区数量以及拓扑 DAG 的结构。

此外,任务的数量有效地限制了整体并行度。每个任务都由一个线程执行。如果线程多于任务,一些线程将空闲,因为没有任务可以分配给它们。

还有一件事:从并行的角度来看,如果您启动一个 KafkaStreams 实例并配置 3 个线程,或者如果您启动三个 KafkaStreams 个实例并配置一个线程,则没有区别每个线程。所有可用任务将平均分配给所有可用线程。