状态生存时间(TTL)
一个时间的生存期(TTL)可以被分配给任何类型的被Keys化状态。如果配置了TTL并且状态值已过期,则将尽力清除存储的值,这将在下面更详细地讨论。
所有状态集合类型都支持每个条目的TTL。这意味着列表数据元和映射条目将独立过期。
为了使用状态TTL,必须首先构建StateTtlConfig
配置对象。然后,可以通过传递配置在任何状态描述符中启用TTL函数:
import org.apache.flink.api.common.state.StateTtlConfig;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.common.time.Time;
StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.seconds(1))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.build();
ValueStateDescriptor<String> stateDescriptor = new ValueStateDescriptor<>("text state", String.class);
stateDescriptor.enableTimeToLive(ttlConfig);
配置有几个选项需要考虑:
该newBuilder
方法的第一个参数是必需的,它是生存时间值。
更新类型配置状态TTL刷新时(默认情况下OnCreateAndWrite
):
StateTtlConfig.UpdateType.OnCreateAndWrite
- 仅限创建和写入权限StateTtlConfig.UpdateType.OnReadAndWrite
- 也读取访问权限
状态可见性配置是否在读取访问时返回过期值(如果尚未清除NeverReturnExpired
)(默认情况下):
StateTtlConfig.StateVisibility.NeverReturnExpired
- 永远不会返回过期的值StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp
- 如果仍然可用则返回
在这种情况下NeverReturnExpired
,过期状态表现得好像它不再存在,即使它仍然必须被删除。该选项对于在TTL之后必须严格读取访问数据的用例非常有用,例如应用程序使用隐私敏感数据。
另一个选项ReturnExpiredIfNotCleanedUp
允许在清理之前返回过期状态。
笔记:
-
状态后台存储上次修改的时间戳以及用户值,这意味着启用此函数会增加状态存储的消耗。堆状态后台存储一个额外的Java对象,其中包含对用户状态对象的引用和内存中的原始长值。RocksDB状态后台为每个存储值,列表条目或映射条目添加8个字节。
-
目前仅支持参考处理时间的 TTL 。
-
尝试恢复先前未配置TTL的状态,使用TTL启用描述符或反之亦然将导致兼容性失败和
StateMigrationException
。 -
TTL配置不是检查点或保存点的一部分,而是Flink如何在当前运行的作业中处理它的方式。