集合的Flink状态TTL到期

时间:2019-07-30 23:03:43

标签: scala apache-flink flink-streaming

感谢您抽出宝贵的时间阅读本文,阅读后我想向您咨询有关Flink 1.8.0中Flink状态TTL功能的专家  这个,对我来说还是模糊的。

https://ci.apache.org/projects/flink/flink-docs-release-1.8/dev/stream/state/state.html#state-time-to-live-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分钟后过期而无法访问。

希望我已将问题弄清楚了,在此先感谢您提供任何形式的帮助。

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配置为OnReadAndWriteOnCreateAndWrite。因此,基本上是为了保持一致,如果要更新值列表,则需要在put()上使用MapState