Kafka Streams线程模型在同一个实例和JVM

时间:2018-03-30 18:30:29

标签: apache-kafka kafka-consumer-api kafka-producer-api apache-kafka-streams confluent-kafka

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

据我所知,这个示例适用于单个'kafka流应用',在第一个图中,它部署在一台机器上并允许使用两个线程(可配置)。它在两个线程之间分裂,导致3个独立的“任务”,我认为这些任务与它们只是并行化的相同。我觉得我很明白。

我的问题是,如果我在同一台机器和同一台机器上部署第二个完全不同的“kafka流应用程序”及其自己唯一的客户端ID。第二个kafka流应用程序是否能够使用与第一个相同的两个(共享)线程,或者第一个流是否可以独占允许使用的线程。

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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