重新启动Kafka Streams应用程序时,先前为空的分区上缺少事件

时间:2019-10-31 09:43:42

标签: apache-kafka apache-kafka-streams

我有一个奇怪的问题,我不明白如何解决。我有一个kafka Streams应用程序(2.1.0),它从大约40个分区的主题中读取。分区正在使用范围分区策略,因此目前其中一些分区可能完全为空。

我的问题是,在应用程序停机期间,这些空分区之一已激活,并且向其中写入了许多事件。但是,当还原该应用程序时,它会从其他分区读取所有事件,但会忽略已存储到先前的空分区中的事件(该应用程序具有特定主题的OffsetResetPolicy LATEST)。最重要的是,当更新的邮件到达特定分区时,它确实消耗了邮件,并以某种方式绕过了先前的邮件。

我的假设是,__consumer_offsets在还原时没有指定分区的任何条目,但是如何避免这种情况而不丢失事件。我的意思是这个话题已经存在 具有指定数量的分区。

这听起来有人熟悉吗?我是否丢失了某些东西,是否需要为kafka设置一些参数,因为我无法弄清楚为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

这是预期的行为。

您的空分区在__consumer_offsets中没有提交的偏移量。如果分区没有提交的偏移量,则auto.offset.rest中指定的偏移量策略用于决定从哪个偏移量开始使用事件。

如果auto.offset.reset设置为LATEST,则您的Streams应用程序将仅在分区中的最新偏移量开始使用,即在停机期间添加事件之后,并且仅消耗停机后被写入分区。

如果将auto.offset.reset设置为EARLIEST,则您的Streams应用将从分区中最早的偏移量开始,并且还会读取停机期间写入分区的事件。

正如@mazaneica在对您的问题的评论中提到的那样,auto.offset.reset仅影响没有提交偏移量的分区。因此,您的非空分区会很好,也就是说,Streams应用程序将在停机之前从其停止的位置消耗事件。