KafkaStreams 应用程序在代理失败后重新处理

KafkaStreams application reprocessing from start after broker failures

我有一个 3-broker Docker Kafka AWS 集群,以及一个 3-container KafkaStreams 应用程序,该应用程序处理来自 "events" 主题且 replication=2。

我遇到了 this question which later brought me to make this question 中其他用户写的失败。停止 KafkaStreams 应用程序后,我重新启动了失败的代理,一个在星期五(花了大约一个小时),另一个在下星期一重新启动。

当代理加入集群时显然正常(显示“失败,我重新启动了应用程序。 __customer_offsets.sh 复制=3,所以它们应该是安全的。

(供参考,集群情况在this question中有更好的描述)。

我的应用程序进行了一些调度,因此输出主题偏移量的总和应该等于原始事件的总和)。无论那里没有什么,它都会以一种包罗万象的方式进入 errors 主题,因此它们总是匹配的。

然而,当重新启动时,应用程序从头开始处理,处理的消息数量几乎翻了一番(发生故障时,有一些未处理的延迟)。

如果 __consumer_offsets 没有丢失(而且它们显然没有丢失 - 它们只是显示复制不足但在整个过程中都很好地存在于代理中),为什么应用程序会从零开始处理?在什么情况下这是预期的 - 或者可能会发生这种情况?

Kafka 在保留一段时间后删除偏移量——默认为 24​​ 小时。因此,如果您没有更改配置,代理会在重新启动时检测到旧的偏移量并将其删除。

在即将发布的 2.0 版本中默认增加到 7 天:https://cwiki.apache.org/confluence/display/KAFKA/KIP-186%3A+Increase+offsets+retention+default+to+7+days

同时比较:https://cwiki.apache.org/confluence/display/KAFKA/KIP-211%3A+Revise+Expiration+Semantics+of+Consumer+Group+Offsets