如何解决关于Flink中状态的TTL配置
让我们假设我具有描述符的这种配置,并且操作是从此处进行的:
ValueStateDescriptor<Event> descriptor = ...;
StateTtlConfig ttlConfigOneHourAndReturnExpire = StateTtlConfig.newBuilder(Time.hours(1))
.setUpdateType(StateTtlConfig.UpdateType.OnReadAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.ReturnExpiredIfNotCleanedUp).build();
descriptor.enableTimeToLive(ttlConfigOneHourAndReturnExpire);
/*after one hour when the state is expired*/
Event e = state.value(); (step 1 and 2)
e.count = e.count + 1; (step 3)
value.update(e); (step 4)
这意味着在过时1小时后,状态将按以下顺序发生:
- 除已弃用的状态外,返回记录的先前状态。
- 读取后将清除记录的先前状态。
- 在传递并清除了先前的状态(以读取状态)后更新对象。
- 在这种情况下更新状态将意味着再次创建状态,因为先前的状态已被删除,并且此值将再花费一个小时,否则此时将清除状态,而不是在点1处,并且对象不会包括更新,它将在到达时存储在状态中?
希望我能解释一下自己,因为文档不清晰。
从我需要在发生日变化时清理状态的角度开始,并且无法使用TTL进行此操作,我想每隔一小时清理一次状态,但是要在删除之前获取状态,更新当前值,然后再创建一个小时,但在丢失之前始终保持先前的状态。
希望这是有道理的,并且可以以某种方式做到。 亲切的问候!
解决方法
如果您需要每小时操纵一次状态,请创建一个自定义ProcessFunction
并使用计时器来触发该操作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。