尝试通过消息有效负载中的时间戳字段将两个流合并在一起,会导致输出主题中的消息重复。这不是预期的。如何避免这种重复?
我正在使用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
查看偏移量
答案 0 :(得分:0)
我发现本地磁盘上的一些剩余状态存储导致重复消息。也就是说,我通过擦除kafka存储多次重复了测试,但是不知道本地磁盘上的状态存储。每次我用相同的消息重复测试时,这些消息与状态存储中的内容相结合,从而导致消息重复。