我有一个主题,其中发布有关文件的事件。在此主题上,将创建一个分组以具有一个表,其中包含每个文件的最新事件。有点像“事件源灯”。流程是这样的:
一些代码:
产生新事件:
event -> {
CompletableFuture<RecordMetadata> retFuture = new CompletableFuture<>();
topicProducer.send(new ProducerRecord<>(applicationTopicName, flowId, event), (recordMetaData, exception) -> {
if (exception != null) {
retFuture.completeExceptionally(exception);
} else {
retFuture.complete(recordMetaData);
}
});
return retFuture;
}
以及稍后查询的商店:
HistoryEventSerde historyEventSerde = new HistoryEventSerde();
KStream<String, HistoryEvent> eventStream = builder.stream(applicationTopicName, Consumed.with(Serdes.String(),
historyEventSerde));
eventStream.selectKey((key, value) -> new HistoryEventKey(key, value.getIdentifier()))
.groupByKey(Grouped.<HistoryEventKey, HistoryEvent>as(null)
.withKeySerde(new HistoryEventKeySerde())
.withValueSerde(new HistoryEventSerde())
)
.reduce((e1, e2) -> e2,
Materialized.<HistoryEventKey, HistoryEvent, KeyValueStore<Bytes, byte[]>>as(streamByKeyStoreName)
.withKeySerde(new HistoryEventKeySerde()));
现在为示例文件(我们称其为file1)会发生这种情况:
第一次没关系。现在,假设相同的文件再次进入该过程:
这可能是什么问题?我曾假设我的归约操作不好(例如:事件的顺序不同),但是从那时起,我给事件添加了时间戳,并以仅保留最新的方式归约它们,但是发生与上述相同的行为。我在做什么错了?