有一种拓扑:
.mapValues((key, messages) -> remoteService.sendMessages(messages))
.flatMapValues(results -> results)
.map((key, result) -> KeyValue.pair(getAggregationKey(result), getAggregationResult(systemClock, result)))
.groupByKey(Grouped.with(createJsonSerde(AggregationKey.class), createJsonSerde(AggregationResult.class)))
.windowedBy(timeWindows)
.reduce((aggregatedResult, v) -> {
int count = aggregatedResult.getCount();
return aggregatedResult.toBuilder().count(count + 1).build();
})
.suppress(untilWindowCloses(Suppressed.BufferConfig.unbounded()))
TimeWindows:
Duration duration = Duration.ofSeconds(60);
TimeWindows timeWindows = TimeWindows.of(duration).grace(Duration.ZERO);
我的假设是聚合结果必须每60秒左右发送一次到接收器主题,但我注意到有时它会发送重复项(数字不精确):第一个事件在第50秒发送,计数器为1000,然后在58秒发送计数器1050发送了具有相同密钥的事件。它不是每分钟发生一次,而是非常频繁地发生。为什么会发生这种情况?
我还注意到,第二个事件的时间戳总是小于第一个,但偏移较大。内部约简主题也是如此。