流处理器的close()init()方法:重新平衡发生时流线程的行为?

时间:2020-02-24 12:18:13

标签: java apache-kafka apache-kafka-streams

我想知道Kafka streams的行为(我正在使用低级Java API)。我正在通过实现接口Stream processor来实现org.apache.kafka.streams.processor.Processor

org.apache.kafka.streams.processor.Processor具有以下方法:

void init(ProcessorContext上下文);

void close();

假设kafka主题有6个分区,并且在我的流应用程序中,它具有num.stream.threads=1,并且SIX instances of streaming application在不同的计算机上运行。因此,这意味着每个流线程将只分配一个分区。

假设其中一台计算机崩溃,然后剩下五台计算机。现在,这将触发重新平衡,当它发生时,我有以下问题:

  • 重新平衡时,StreamThread是否会死?由于StreamThread是线程,因此在重新平衡期间它们是否保持“活动”状态或所有Stream线程均被“杀死”并重新创建?

  • 在创建StreamProcessor实例时是否为每个重新平衡调用了init()/ close(),还是在创建StreamThread时调用了init()/ close()?基本上想知道这些方法在什么阶段被调用以及重新平衡/创建流线程/在创建处理器实例时或在创建流任务时的关系。

  • 如何使客户以编程方式离开小组?我确实对此进行了搜索,但得到的结果不相关。

1 个答案:

答案 0 :(得分:1)

重新平衡发生时,StreamThread是否会死?由于StreamThread是线程,因此在重新平衡期间它们是否保持“活动”状态或所有Stream线程被“杀死”并重新创建?

否,线程保持活动状态。 (只有崩溃机器上的线程显然会死掉。)

在创建StreamProcessor实例时是否调用了init()/ close(),或者对于每个重新平衡还是在创建StreamThread时调用了init()/ close()?基本上想知道在什么阶段调用这些方法,以及重新平衡/创建流线程/在创建处理器实例时或在创建流任务时的关系。

这取决于版本。在较旧的版本(2.3.x或更旧的版本)中,在重新平衡期间,所有任务都被挂起(即暂停),因此将调用close()。如果恢复(或迁移并因此重新创建)现有任务,则会调用init()。因此,基本上在启动StreamThread时,它首先会触发重新平衡,并在分配分区后创建任务并进行相应的init()调用。对于触发平衡的现有StreamThreads,所有任务都将挂起(即,对close()的调用)并重新分配,并且新任务将重新开始。

在较新版本(2.4.x和更高版本)中,完成了增量重新平衡,因此在重新平衡期间不再暂停任务。只有当任务从一个StreamThread迁移到另一个任务时,该任务才会在一个线程上关闭并在新线程上重新初始化。

如何使客户以编程方式离开小组?但是,我确实对此进行了搜索。

不确定您的确切意思。但是,您可以调用KafkaStreams#close()来停止其所有本地StreamThreads,因此这些线程最终将离开该组。