我在Apache Beam(在Dataflow中运行)中有一种情况,我基于本文创建了一个简单的有状态DoFn。上游窗口是全局的,更改它将影响下游聚合。
目前,我没有做任何事情来缩小状态,它似乎只是无界增长。这是真的吗?无限制的国家增长是个问题吗?
我想简单地将TTL附加到状态,但没有看到这个功能。
我正在考虑在数据上存储自己的时间戳,并使用计时器定期清理表。这样合适吗?
正在存储的数据是某些事件数据的缓存键。缓存键告诉我,我需要为这个事件查找过去的事件数据,以补充当前事件。有状态的DoFn可以很好地解决这个问题,但是,就像我说的,我担心它会变得无界。我不确定在Dataflow中是否有任何后果。
状态在窗口过期时自动垃圾收集。由于您正在使用全局窗口,因此它永远不会过期。所以你需要自己用计时器来管理。
我不知道你代码的细节,但是你的想法听起来很对:
- 用你的状态存储时间戳,这样你就知道它的年龄了
- 设置一个周期重复的事件时间定时器:
- 清除表中比TTL 早的内容
@OnTimer
方法可以重置相同的定时器
您也可以直接为元素的TTL设置定时器,但这会导致触发更多定时器。所以只有在业务量低的时候才有用。(但如果销量很低,你可能不必担心无限增长)