Apache kafka 在同一实例中执行StreamTasks与在多个实例中执行StreamTasks之间的差异
假设我有一个包含3个分区的主题Apache kafka 在同一实例中执行StreamTasks与在多个实例中执行StreamTasks之间的差异,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,假设我有一个包含3个分区的主题 方法1:我运行一个Kafka Streams实例,它启动3个任务[0\u 0,0\u 1,0\u 2],每个任务从一个分区消耗。 方法2:我启动了同一streams应用程序的三个实例,这里又启动了三个任务,但现在,它分布在创建的三个实例中。 哪种方法更可取?为什么? 在方法1中,所有任务是否作为同一线程的一部分运行,而在方法2中,它们运行在不同的线程上,或者是不同的? 考虑到streams应用程序具有非常简单的拓扑结构,并且只映射单个流中的值。默认情况下,单个Ka
方法1:我运行一个Kafka Streams实例,它启动3个任务[0\u 0,0\u 1,0\u 2],每个任务从一个分区消耗。
方法2:我启动了同一streams应用程序的三个实例,这里又启动了三个任务,但现在,它分布在创建的三个实例中。
哪种方法更可取?为什么?
在方法1中,所有任务是否作为同一线程的一部分运行,而在方法2中,它们运行在不同的线程上,或者是不同的?
考虑到streams应用程序具有非常简单的拓扑结构,并且只映射单个流中的值。默认情况下,单个
KafkaStreams
实例运行一个线程,因此在“方法1”中,所有三个任务都由单个线程执行。在“方法2”中,每个任务都由自己的线程执行。注意,您还可以通过num.stream.threads
配置参数配置多线程前置KafkaStreams
实例。如果将“方法1”设置为3
,则两种方法大致相同。您需要多少线程取决于您的工作负载,即每个时间单位需要处理多少消息以及计算的成本。这还取决于硬件:对于单核CPU,配置多个线程可能没有意义,但您应该在多台机器上部署多个实例以获得更多硬件。因此,如果您的工作负载是轻量级的,那么一个单线程实例就足够了
还要注意的是,您可能会受到网络限制。在这种情况下,启动更多线程没有帮助,但您也希望扩展到多台机器
最后要考虑的是容错性。即使单个线程/实例的功能足够强大,不会出现延迟,但如果实例崩溃,该怎么办?如果您只有一个实例,那么整个计算将下降。如果您运行两个实例,第二个实例将接管所有工作,并且您的应用程序保持在线