将条目仅在定义的时间内保存在状态存储中

时间:2019-06-21 13:53:07

标签: apache-kafka apache-kafka-streams spring-kafka

问题:我需要找出最近一次发送消息的方式,例如24小时。我有以下流和状态存储以进行查找。

@SendTo(Bindings.MESSAGE_STORE)
@StreamListener(Bindings.MO)
public KStream<?, ?> groupBySender(KStream<String, Message> messages) {

     return  messages.selectKey((key,message) -> message.from)
                     .map((k,v) -> new KeyValue<>(k, v.sentAt.toString()))
                     .groupByKey()
                     .reduce((oldTimestamp, newTimestamp) -> newTimestamp,
                                Materialized.as(AggregatorApplication.MESSAGE_STORE))
                     .toStream();

}

工作正常

[
    "key=123 value=2019-06-21T13:29:05.509Z",
    "key=from value=2019-06-21T13:29:05.509Z",
]

所以看起来很像:

store.get(from);

但是我想从存储中自动删除早于24小时的条目,目前它们将永久保存下去

有没有更好的方法?也许有一些开窗操作?

1 个答案:

答案 0 :(得分:0)

Atm KTables(基本上是键值存储)不支持TTL(请参阅https://issues.apache.org/jira/browse/KAFKA-4212

当前的建议是,如果您想使数据过期,请使用窗口存储。您可能希望使用自定义.transform()而不是windowedBy().reduce(),以便获得更大的灵活性。 (请参阅https://docs.confluent.io/current/streams/developer-guide/processor-api.html