我有一个奇怪的问题,我不明白如何解决。我有一个kafka Streams应用程序(2.1.0),它从大约40个分区的主题中读取。分区正在使用范围分区策略,因此目前其中一些分区可能完全为空。
我的问题是,在应用程序停机期间,这些空分区之一已激活,并且向其中写入了许多事件。但是,当还原该应用程序时,它会从其他分区读取所有事件,但会忽略已存储到先前的空分区中的事件(该应用程序具有特定主题的OffsetResetPolicy LATEST)。最重要的是,当更新的邮件到达特定分区时,它确实消耗了邮件,并以某种方式绕过了先前的邮件。
我的假设是,__consumer_offsets
在还原时没有指定分区的任何条目,但是如何避免这种情况而不丢失事件。我的意思是这个话题已经存在
具有指定数量的分区。
这听起来有人熟悉吗?我是否丢失了某些东西,是否需要为kafka设置一些参数,因为我无法弄清楚为什么会发生这种情况?
答案 0 :(得分:1)
这是预期的行为。
您的空分区在__consumer_offsets
中没有提交的偏移量。如果分区没有提交的偏移量,则auto.offset.rest
中指定的偏移量策略用于决定从哪个偏移量开始使用事件。
如果auto.offset.reset
设置为LATEST
,则您的Streams应用程序将仅在分区中的最新偏移量开始使用,即在停机期间添加事件之后,并且仅消耗停机后被写入分区。
如果将auto.offset.reset
设置为EARLIEST
,则您的Streams应用将从分区中最早的偏移量开始,并且还会读取停机期间写入分区的事件。
正如@mazaneica在对您的问题的评论中提到的那样,auto.offset.reset
仅影响没有提交偏移量的分区。因此,您的非空分区会很好,也就是说,Streams应用程序将在停机之前从其停止的位置消耗事件。