问题:我需要找出最近一次发送消息的方式,例如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小时的条目,目前它们将永久保存下去
有没有更好的方法?也许有一些开窗操作?
答案 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)