如何使用标点符号从状态存储中删除旧记录? (卡夫卡)

时间:2020-07-20 14:01:22

标签: java apache-kafka apache-kafka-streams ktable

我已经使用Ktable为主题创建了streamsBuilder.table("myTopic"),并将其具体化为状态存储,以便可以使用交互式查询。

每个小时,我想从此状态存储(及相关的changelog主题)中删除其值在过去一小时内未更新的记录。

我相信使用punctuator可以实现此目的,但是到目前为止,我只使用了DSL,因此不确定如何进行。如果有人可以给我一个例子,我将不胜感激。

谢谢

杰克

1 个答案:

答案 0 :(得分:4)

可以将Processor API与DSL混合并匹配,但是您不能处理KTable。您将需要转换为KStream。或者,您可以使用与状态存储进行交互的处理器创建新的拓扑。

您将需要将该状态存储在某个位置-如何确定记录是否早于一小时。一种选择是向状态存储中的每个记录添加时间戳。

在Processor的init方法中,您可以调用schedule(标点符号)以迭代状态存储中的记录并删除旧记录:

context.schedule(Duration.ofMillis(everyHourInMillis), PunctuationType.WALL_CLOCK_TIME, timestamp -> {
    myStateStore.all().forEachRemaining(keyValue -> {
        if (Instant.ofEpochMilli(valueInStateStore).compareTo(olderThanAnHour) < 0) {
            myStateStore.delete(keyValue.key);
        }
    });
});