我知道您的信息流随时随地都可能发生重新平衡。如果确实如此,则由于没有针对给定的偏移量提交最新的偏移量,因此可能会发生事件的重新处理。
Kafka Streams是否允许在重新平衡发生之前完成任何飞行中的处理?我的意思是,您的应用程序正处于消耗记录的过程中(在您的过程方法内部),发生重新平衡事件。该处理是否立即中止或允许该处理方法完成?
一个具体的例子是
public void process(String key, String value) {
String result = computeSomething(key,value) <---rebalance triggered here in time
stateStore.put(key,result);
context.forwared(key, result);
}
最后的计算是否会在状态存储中结束并转发给接收器主题?因此,当重新平衡完成时,意味着新分区在存储中将具有最后一个值,但仍然有可能对该主题中的消息进行“重新处理”?
答案 0 :(得分:1)
如果触发了重新平衡,(基础使用者的)后台心跳线将仅在客户端上设置标志。处理将正常继续。处理完成后,将调用Consumer#poll()
并评估重新平衡标志。如果设置了该标志,则将刷新所有待处理的状态存储和主题写操作,将提交输入主题偏移量,然后继续进行重新平衡。
唯一的情况是,如果您的处理花费的时间比max.poll.interval.ms
更长-如果在此超时之前未调用poll()
(例如,您的process()
方法花费的时间更长),则应用程序被视为“死亡”,并且无论如何都会继续进行平衡。对于这种情况,下一次调用poll()
时,应用程序将检测到它已退出消费者组,并重新加入该组,即,它将触发新的重新平衡。