我有一个带有Kafka Streams绑定程序的Spring Cloud Stream(Kafka Streams版本2.1)应用程序,并且我正在进行时间窗口聚合,在这里我只想执行一些操作(API调用)一次 窗户关闭。我观察到的行为是,每次重新启动应用程序时,都会为存储在变更日志中的每个记录调用mapValues函数, 导致对API进行了大量的调用。
我对prevent()的理解是,对于每个关闭的时间窗口,都应将一个逻辑删除记录发送到聚合changelog主题,即使在应用程序重新启动后,也有效地阻止了我对其进行重新处理。
什么可能导致重新启动应用程序时重新处理消息?
我已经确认该应用程序不会重复使用源主题。
以下相关代码的片段:
Serde<Aggregator> aggregatorSerde = new JsonSerde<>(Aggregator.class, objectMapper);
Materialized<String, TriggerAggregator, WindowStore<Bytes, byte[]>> stateStore = Materialized.<String, Aggregator, WindowStore<Bytes, byte[]>>
with(Serdes.String(), aggregatorSerde);
KTable<Windowed<String>, List<Event>> windowedEventKTable = inputKStream
.groupByKey()
.windowedBy(TimeWindows.of(Duration.ofSeconds(30)).grace(Duration.ofSeconds(5))
.aggregate(Aggregator::new, ((key, value, aggregate) -> aggregate.aggregate(value)), stateStore)
.suppress(Suppressed.untilWindowCloses(Suppressed.BufferConfig.unbounded()).withName(supressStoreName))
.mapValues((windowedKey, groupedTriggerAggregator) -> {//code here returning a list})
.toStream((k,v) -> k.key())
.flatMapValues((readOnlyKey, value) -> value);