感谢您抽出宝贵的时间阅读本文,阅读后我想向您咨询有关Flink 1.8.0中Flink状态TTL功能的专家 这个,对我来说还是模糊的。
我想确定启用TTL功能的位置是在键字段还是在值字段上。特别是,说我有一个像这样的mapState结构:
mapState = Map[String,List[String]]
e.g. val mapState = Map("haha" -> List("foo","bar")) in Scala
where "haha" is the key of the mapState and List("foo","bar") is the value
如果要通过StateTtlConfig在mapState上设置1分钟的TTL,则立即(不到1分钟)写入List中的值之一,说“ foo”。
然后在1分钟后,当TTL触发时,键“ haha”失效还是“ bar”值失效?
换句话说,如果密钥上的密码过期,我的理解是mapState将保持不变
mapState = Map("haha" -> List("foo","bar"))
因为写入值“ foo”会重置键上的TTL,因此整个mapState保持不变
另一种情况是,如果该值过期,则mapState将变为
mapState = Map("haha" -> List("foo"))
因为值“ bar”将在1分钟后过期而无法访问。
希望我已将问题弄清楚了,在此先感谢您提供任何形式的帮助。
答案 0 :(得分:1)
使用TTL访问状态的代码如下:
<SE extends Throwable, CE extends Throwable, CLE extends Throwable, V> TtlValue<V> getWrappedWithTtlCheckAndUpdate(
SupplierWithException<TtlValue<V>, SE> getter,
ThrowingConsumer<TtlValue<V>, CE> updater,
ThrowingRunnable<CLE> stateClear) throws SE, CE, CLE {
TtlValue<V> ttlValue = getter.get();
if (ttlValue == null) {
return null;
} else if (expired(ttlValue)) {
stateClear.run();
if (!returnExpired) {
return null;
}
} else if (updateTsOnRead) {
updater.accept(rewrapWithNewTs(ttlValue));
}
return ttlValue;
}
验证值是否过期的方法如下:
static <V> boolean expired(@Nullable TtlValue<V> ttlValue, long ttl, long currentTimestamp) {
return ttlValue != null && expired(ttlValue.getLastAccessTimestamp(), ttl, currentTimestamp);
}
这基本上意味着在这种情况下,它将检查整个列表的TTL,而不是单独的元素。因此,根据StateTtlConfig
,整个列表将过期,或者整个列表将不过期。
可用的TTL配置为OnReadAndWrite
和OnCreateAndWrite
。因此,基本上是为了保持一致,如果要更新值列表,则需要在put()
上使用MapState
。