加入后,主题包含重复消息

时间:2019-05-01 14:33:15

标签: apache-kafka-streams spring-cloud-stream

尝试通过消息有效负载中的时间戳字段将两个流合并在一起,会导致输出主题中的消息重复。这不是预期的。如何避免这种重复?

我正在使用DSL拓扑,该拓扑使用来自两个主题的两个流。当我在每个流中进行一些映射时,这导致了另外两个主题。最后,在加入后,第五个主题将显示结果,该主题将显示重复的消息。我检查了其他四个主题是否不包含重复项。我还注意到,我提供给kafka流连接函数的函数被反复调用。此功能已经表明发生重复。

KStream<String, MappedOriginalSensorData> flattenedOriginalData = originalData
                .flatMap(flattenOriginalData())
                .through("mapped-original-sensor-data", Produced.with(Serdes.String(), new MappedOriginalSensorDataSerde()));

        KStream<String, MappedErrorScoreData> enrichedErrorData = errorScoreData
                .map(enrichWithModelAndAlgorithmAndReduceKey())
                .through("mapped-error-score-data-repartition", Produced.with(Serdes.String(), new MappedErrorScoreDataSerde()));


        return enrichedErrorData
                //#3. Join
                .join(flattenedOriginalData, join(),
                        JoinWindows.of(Duration.ofMillis(1).toMillis()), Joined.with(Serdes.String(), new MappedErrorScoreDataSerde(), new MappedOriginalSensorDataSerde()))
                //#4. set key
                .selectKey((k,v) -> v.getOriginalKey())
                //#5. Map removing the originalKey field)
                .mapValues(removeOriginalKeyField())
                .through("joined-data-repartition");

我希望joind-data-partition主题仅显示基于有效负载的唯一消息:

{
  "timestamp": 1556626280000,
  "errorSignal": 84.98,
  "originalSignal": 36
}
Key:
1234:a:v2:nord::TE7
Timestamp:
Apr 30th, 2019 14:11:20.00
Offset:
3629
Partition:
0

{
  "timestamp": 1556626280000,
  "errorSignal": 84.98,
  "originalSignal": 36
}
Key:
1234:a:v2:nord::TE7
Timestamp:
Apr 30th, 2019 14:11:20.00
Offset:
3628
Partition:
0

查看偏移量

1 个答案:

答案 0 :(得分:0)

我发现本地磁盘上的一些剩余状态存储导致重复消息。也就是说,我通过擦除kafka存储多次重复了测试,但是不知道本地磁盘上的状态存储。每次我用相同的消息重复测试时,这些消息与状态存储中的内容相结合,从而导致消息重复。