Apache kafka 如何使用Kakfa流删除重复的输入消息

Apache kafka 如何使用Kakfa流删除重复的输入消息,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有一个主题,在这个主题中,我从各种设备中获得了一系列事件。有n台设备每s秒发出天气报告 问题是,这些设备每秒钟发出5-10条相同值的记录。因此,如果您在kafka主题中看到单个设备的输出,则如下所示:- 对于设备1:- t1,t1,t1,t1(在同一时刻,然后是秒间隙)t2,t2,t2,t2(然后是秒间隙),t3,t3,t3,t3 但是,我想删除卡夫卡中的这些重复记录,它们是突发事件。 我想消费如下:- t1、t2、t3 我试图使用Kafka stream API提供的窗口和ktable概念,

我有一个主题,在这个主题中,我从各种设备中获得了一系列事件。有n台设备每s秒发出天气报告

问题是,这些设备每秒钟发出5-10条相同值的记录。因此,如果您在kafka主题中看到单个设备的输出,则如下所示:-

对于设备1:- t1,t1,t1,t1(在同一时刻,然后是秒间隙)t2,t2,t2,t2(然后是秒间隙),t3,t3,t3,t3

但是,我想删除卡夫卡中的这些重复记录,它们是突发事件。 我想消费如下:- t1、t2、t3


我试图使用Kafka stream API提供的窗口和ktable概念,但似乎不可能。有什么想法吗?

您可能想使用卡夫卡的日志压缩。但是为了使用它,所有重复的消息都应该有相同的密钥,而非重复消息应该有不同的密钥。看看这个

可以选择使用t作为键将主题读入KTable。重复的值将被视为向上插入,而不是插入,这将有效地删除它们。然后将KTable写入另一个主题

我不认为,它叫做“扁平化”…您可能需要使用处理器API和标点:@MatthiasJ.Sax我试图避免使用处理器API。使用kafka streams DSL是没有办法做到这一点的吗?为什么要避免它?其实用起来并不难。对于DSL,不能保证您可以消除所有事件的重复——您可以使用KTables和Cache来减少重复的数量。您能详细介绍一下这种方法吗?我想这可能需要将“log retention ms”与Kafka属性“s”保持一致。您需要配置log.cleanup.policy=compact属性,并将log.cleaner.min.compression.lag.ms属性设置为0以立即压缩。上面提到的链接详细解释了它的工作原理。