Kafka流重新平衡行为

时间:2020-01-14 15:25:29

标签: apache-kafka-streams

我知道您的信息流随时随地都可能发生重新平衡。如果确实如此,则由于没有针对给定的偏移量提交最新的偏移量,因此可能会发生事件的重新处理。

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);
 }

最后的计算是否会在状态存储中结束并转发给接收器主题?因此,当重新平衡完成时,意味着新分区在存储中将具有最后一个值,但仍然有可能对该主题中的消息进行“重新处理”?

1 个答案:

答案 0 :(得分:1)

如果触发了重新平衡,(基础使用者的)后台心跳线将仅在客户端上设置标志。处理将正常继续。处理完成后,将调用Consumer#poll()并评估重新平衡标志。如果设置了该标志,则将刷新所有待处理的状态存储和主题写操作,将提交输入主题偏移量,然后继续进行重新平衡。

唯一的情况是,如果您的处理花费的时间比max.poll.interval.ms更长-如果在此超时之前未调用poll()(例如,您的process()方法花费的时间更长),则应用程序被视为“死亡”,并且无论如何都会继续进行平衡。对于这种情况,下一次调用poll()时,应用程序将检测到它已退出消费者组,并重新加入该组,即,它将触发新的重新平衡。