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

Missing events on previously empty partition when restarting kafka streams app

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

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

我的假设是 __consumer_offsets 在恢复时没有指定分区的任何条目,但我怎样才能在不丢失事件的情况下避免这种情况。我的意思是该主题已经存在 具有指定数量的分区。

这听起来很熟悉吗?我是否遗漏了什么,我是否需要为 kafka 设置一些参数,因为我不知道为什么会这样?

这是预期的行为。

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

如果 auto.offset.reset 设置为 LATEST,您的 Streams 应用将仅在分区中的最新偏移处开始消费,即在停机期间添加的事件之后,它只会消费停机后写入分区的事件。

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

正如@mazaneica 在对您的问题的评论中提到的,auto.offset.reset 仅影响没有提交偏移量的分区。所以您的非空​​分区会很好,即 Streams 应用程序将从停机前停止的地方使用事件。