假设我有这样的过程函数(带有rocksdb状态后端(:
public class Test extends KeyedProcessFunction<...>
{
private transient ValueState<Integer> ...;
...
@Override
public void open(Configuration parameters) throws Exception
{
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.minutes(10))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.cleanupInRocksdbCompactFilter(1000)
.build();
ValueStateDescriptor<Integer> testDescr = new ValueStateDescriptor<Integer>(
"test",
TypeInformation.of(Integer.class)
);
testDescr.enableTimeToLive(ttlConfig);
...
}
}
kafkaSource.keyby(object -> object.getKey()).process(new Test()))...;
假设这是一个无边界流应用程序比方说,我看到了名为";橙色";,但是只有一次(或者只是假设进程函数为键"orange"调用一次(;橙色";。在这种情况下,键";橙色";会永远留在摇滚乐队吗?
非活动键的状态"橙色";将在第一次RocksDB压缩期间从RocksDB中删除,该压缩发生在该密钥的状态创建后10分钟之后(因为TTL配置生成器配置了10分钟TTL超时(。在此之前,状态将在RocksDB中徘徊,但由于您已经配置了StateVisibility.NeverReturnExpired
,如果您尝试访问它,Flink将假装它不在那里。