有状态的DoFn是否有TTL过期的状态?还是说无界增长没问题?



我在Apache Beam(在Dataflow中运行)中有一种情况,我基于本文创建了一个简单的有状态DoFn。上游窗口是全局的,更改它将影响下游聚合。

目前,我没有做任何事情来缩小状态,它似乎只是无界增长。这是真的吗?无限制的国家增长是个问题吗?

我想简单地将TTL附加到状态,但没有看到这个功能。

我正在考虑在数据上存储自己的时间戳,并使用计时器定期清理表。这样合适吗?

正在存储的数据是某些事件数据的缓存键。缓存键告诉我,我需要为这个事件查找过去的事件数据,以补充当前事件。有状态的DoFn可以很好地解决这个问题,但是,就像我说的,我担心它会变得无界。我不确定在Dataflow中是否有任何后果。

状态在窗口过期时自动垃圾收集。由于您正在使用全局窗口,因此它永远不会过期。所以你需要自己用计时器来管理。

我不知道你代码的细节,但是你的想法听起来很对:

  • 用你的状态存储时间戳,这样你就知道它的年龄了
  • 设置一个周期重复的事件时间定时器:
    • 清除表中比TTL
    • 早的内容
    • @OnTimer方法可以重置相同的定时器

您也可以直接为元素的TTL设置定时器,但这会导致触发更多定时器。所以只有在业务量低的时候才有用。(但如果销量很低,你可能不必担心无限增长)

最新更新