Apache kafka 卡夫卡流:如何在申请再处理之前获得偏移限制以及如何停止

Apache kafka 卡夫卡流:如何在申请再处理之前获得偏移限制以及如何停止,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我正在寻找一种在KafkaStreams中使用重新处理工具的方法,该工具允许重新处理主题中从一开始的数据(应用一些过滤器并将这些事件的更新版本写入同一主题)。同时,有一个长期运行的应用程序正在处理来自该主题的数据 为了只重新处理到应用程序启动并在启动后停止的时间点,需要知道何时停止,这是在该时间点产生的最新偏移量。例如,可以在启动具有(分区->偏移)了解这些限制的拓扑之前构建一个映射,这样当达到该偏移量时,应用程序将能够停止,并将当前分区和偏移量(通过处理器API)与该初始映射上的偏移量限制进行

我正在寻找一种在KafkaStreams中使用重新处理工具的方法,该工具允许重新处理主题中从一开始的数据(应用一些过滤器并将这些事件的更新版本写入同一主题)。同时,有一个长期运行的应用程序正在处理来自该主题的数据

为了只重新处理到应用程序启动并在启动后停止的时间点,需要知道何时停止,这是在该时间点产生的最新偏移量。例如,可以在启动具有(分区->偏移)了解这些限制的拓扑之前构建一个映射,这样当达到该偏移量时,应用程序将能够停止,并将当前分区和偏移量(通过处理器API)与该初始映射上的偏移量限制进行比较

从卡夫卡流中访问最新偏移量信息是否可能/有意义?有没有其他解决办法? (我想你可以通过卡夫卡的普通消费者来创建它,寻找目的并获得地位,但我想问的是,卡夫卡团队中是否有集成的解决方案)

另外,如何仅在所有分区都达到其偏移量时轻轻停止应用程序,知道此信息是分布式的,因此您需要从所有实例了解状态


Kafka/KafkaStreams 2.1,Scala 2.12

使用消费者获得末端偏移似乎是合理的。要停止应用程序,您需要构建一个跟踪进度的手动解决方案。例如,使用
transformValues()
可以检查输入记录的主题名称、分区和偏移量(使用通过
init()
方法提供的
context
对象)。这应该允许您在处理所有数据时调用
KafkaStreams#close()


你可能会对这个KIP(在主动atm中)感兴趣,它讨论了类似的想法:

我想我必须实现KIP所建议的东西。一些疑问:-
停止处理此分区(即暂停分区)
:如何在KS中执行此操作?我知道我可以忽略新数据,但如何“暂停”?-<代码>组的最后一个运行成员,即应用程序也将是组的负责人,并且将知道它是否是唯一的运行实例),是否应该在此处调用
KafkaStreams.close()
,对吗?但是,在容器化场景中,任务将在失败时重新启动,他们应该读取标记,看看是否应该在启动时死亡,因为它已完成。在Kafka Streams中,您不能
pause()
a分区(KIP将更改Kafka Streams,以便Kafka Streams可以在内部执行此操作,但不会公开)。确定何时关闭()是一件棘手的事情——尤其是手动实现时。我提到KIP是为了指出设计选择——我怀疑在不修改Kafka Streams本身的情况下,您是否可以实现它1:1,但您需要进行一些不同的权衡。是否可以知道您是否处于KS的偏移端?即零滞后。那会有帮助的。因为当我们知道我们已经消耗了整个分区时,我可以停止,以确保之前的所有内容都已重新处理。Kafka Streams无法告诉您--您需要事先手动获取结束。