Kafka Streams:重新分区时如何避免向下游转发两次

Kafka Streams: How to avoid forwarding downstream twice when repartitioning

在我的应用程序中,我有一个拓扑非常简单的 KafkaStreams 实例:有一个处理器,有一个键值存储,每条传入消息都被写入存储,然后转发到下游的接收器。

我想增加我的源主题的分区数,然后重新处理数据,以便每个存储仅包含与其分区相关的键。 (我知道这是使用应用程序重置工具完成的)。但是,在重新处理数据时,我不想向下游转发任何内容;我只想转发新数据。 (否则,结果主题的消费者将再次处理旧值)。我的问题:有没有一种简单的方法可以实现这一目标?是否有任何内置机制可以帮助我区分重新处理的数据和新数据?

提前致谢

没有内置机制。但是,当您重新处理数据时,您也许可以只删除写入结果主题的接收器操作——当重新处理完成后,您可以停止应用程序,再次添加接收器并重新启动。不确定这是否适合您。

另一种可能的解决方案是,使用 transform() 实现基于偏移的过滤器。对于每个输入主题分区,您将获得第一条新消息的偏移量(这是您在编写 Transformer 之前需要手动执行的操作)。您使用此信息,将过滤器实现为自定义 Transformer:对于每个输入记录,您检查记录的分区和偏移量并将其删除,如果记录的偏移量小于此记录的第一条新消息的偏移量分区.