状态生存时间(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如何在当前运行的作业中处理它的方式。