我想知道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()?基本上想知道这些方法在什么阶段被调用以及重新平衡/创建流线程/在创建处理器实例时或在创建流任务时的关系。
如何使客户以编程方式离开小组?我确实对此进行了搜索,但得到的结果不相关。
答案 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
,因此这些线程最终将离开该组。