Processor.init()在Kafka Stream中为单个任务多次调用

时间:2018-03-16 08:53:50

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

我使用了一个利用WALL_CLOCK_TIME标点符号的处理器,我注意到在重新平衡阶段后,同一个任务会多次调用init()方法。

我在init()

中记录了这一行
log.info("In processor init, taskId is {}, cancellable is {}", context.taskId(), statisticsSending);

在日志中,我可以看到它被调用了两次:

  

07:53:15 INFO - 在处理器中   init,taskId是1_0,可取消是   org.apache.kafka.streams.processor.internals.PunctuationSchedule$RepointableCancellable@11a53ebd

     

07:53:15 INFO - 在处理器中   init,taskId是1_0,可取消是   org.apache.kafka.streams.processor.internals.PunctuationSchedule$RepointableCancellable@7770d7b7

另外,我记录了close()方法中发生的事情,我看到Cancellable被取消了...

  

07:53:15 INFO - 关闭可取消   org.apache.kafka.streams.processor.internals.PunctuationSchedule$RepointableCancellable@11a53ebd

...从其身份哈希码(11a53ebd)判断,现有处理器已被重用,但也创建了一个新处理器。结果,我的定期任务已安排两次,而不是一次。

我认为每个任务只有一个处理器。什么可能导致这种行为的想法,以及如何防止它发生?

1 个答案:

答案 0 :(得分:2)

在重新平衡期间,所有Processor都会关闭,之后会在重新平衡后再次初始化。这是确保没有数据丢失所必需的。

但是,您看到的哈希是指注册的标点符号,而不是Processor对象。因此,如果cancel中的标点符号closeschedule中的标点符号init()中的标点符号将被新的时间表替换。