重新启动 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 应用程序将从停机前停止的地方使用事件。
我有一个奇怪的问题,我不知道该如何解决。我有一个 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 应用程序将从停机前停止的地方使用事件。