在同一实例中执行 StreamTasks 的区别 v/s 多个实例

Difference between executing StreamTasks in the same instance v/s multiple instances

假设我有一个包含 3 个分区的主题
方法 1: 我 运行 Kafka Streams 的一个实例,它启动 3 个任务 [0_0,0_1,0_2] 并且每个这些任务消耗一个分区。
方法 2: 我启动了同一个流应用程序的三个实例,这里再次启动了三个任务,但现在,它分布在创建的 3 个实例中。
哪种方法更可取,为什么?
在方法 1 中,所有任务 运行 作为同一线程的一部分执行,而在方法 2 中,它们 运行 在不同的线程上,还是不同?

考虑到流应用程序具有非常简单的拓扑结构,并且仅映射来自单个流的值

默认情况下,单个 KafkaStreams 实例 运行 一个线程,因此在 "Method 1" 中所有三个任务都由一个线程执行。在 "Method 2" 中,每个任务都由自己的线程执行。请注意,您还可以通过 num.stream.threads 配置参数配置多线程 pre KafkaStreams 实例。如果将它设置为 3 for "Method 1" 两种方法或多或少是相同的。您需要多少个线程取决于您的工作量,即每个时间单位需要处理多少条消息以及计算的开销。它还取决于硬件:对于单核CPU,配置多个线程可能没有意义,但您应该在多台机器上部署多个实例以获得更多硬件。因此,如果您的工作负载很轻,一个单线程实例可能就足够了。

另请注意,您可能受网络限制。对于这种情况,启动更多线程无济于事,但您也想扩展到多台机器。

最后一个考虑因素是容错。即使单个 thread/instance 可能足够强大而不会滞后,如果实例崩溃会发生什么?如果你只有一个实例,整个计算就会下降。如果您 运行 两个实例,第二个实例将接管所有工作并且您的应用程序保持在线。