Apache Beam中的缓存:静态变量与状态处理

时间:2018-02-12 18:38:38

标签: java caching google-cloud-dataflow apache-beam

我在Java中的数据流管道中为其中一个DoFns添加了缓存功能。 DoFn当前正在使用REST客户端向每个输入元素发送请求到端点(根据请求数量收费,响应将大致每小时更改一次),我想要实现的是缓存来自终点,并且每15分钟就到期一次。

我找到了两种方法:一种来自类似的stackoverflow question建议使用静态变量来托管缓存服务(我使用guava进行缓存)。但是,我不确定如何从DoFn外部更新到期日。

我发现的另一种方法是使用stateful processing来存储跟踪请求和响应的哈希,并使用TimerSpec来清除"缓存"每15分钟一次。虽然看起来无法为缓存中的每个元素设置计时器。

我还没有尝试过第二种方法。虽然我要实施它,但我想知道是否有人遇到过类似的情况,并且有任何建议,或者有更好的方法。

1 个答案:

答案 0 :(得分:0)

  

但是我不知道如何从DoFn外部更新到期日。

你需要吗? DoFn首先进行查找,如果条目已过期,则会发出请求并更新缓存。缓存读取&写需要是线程安全的。

  

虽然看起来无法为缓存中的每个元素设置计时器。

您可以设置一个定时器,每隔X分钟扫描整个缓存并刷新过期的条目。但是,如果您的状态未使用这样的全局状态键入,则会限制管道的并行性。