Kafka Streams与prevent()重新处理变更日志

时间:2019-10-25 21:31:37

标签: apache-kafka-streams

我有一个带有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);

0 个答案:

没有答案