在Apache Flink中手动更新状态的最佳方法是什么?

时间:2018-11-19 14:43:04

标签: java apache-flink flink-streaming

我在一个股票项目中使用Apache Flink来计算当前的价格变化。公式是

 price_change = (current_price - previous_close_price) / previous_close_price

previous_close_price是证券在交易前一天的收盘价。市场每天开放之前,我需要更新previous_close_price

现在我已经提出了几种解决方案,但是我不知道哪个是最好的。

  1. previous_close_price存储在Redis中,并在每次计算中获取价格。更新价格既方便又灵活,但是此解决方案可能会降低性能。

  2. 将状态TTL设置为1天。旧状态过期时获取新状态。但这不灵活,因为TTL是硬编码的。

  3. Broadcast State Pattern。我不确定该解决方案是否有效。

  4. 发送特殊消息到flink。当flink收到消息时,它将更新previous_close_price

任何建议都值得赞赏。

1 个答案:

答案 0 :(得分:3)

我建议在#4上使用一个变体:

有两个来源,一个仅用于收盘价,另一个用于交易流。通过安全性对两个流进行键控,然后将它们与CoProcessFunction连接。在Key的状态下,将Previous_close_price存储在CoProcessFunction中。

每天在市场开盘前,输入更新后的收盘价。

这可以通过RichCoFlatMap来完成,但我建议您使用CoProcessFunction,因为您可能希望使用侧面输出来报告错误(例如,缺少前收盘价的证券)。

关于其他方法:

  1. 我认为将previous_close_price数据保存在外部数据存储中没有任何好处。
  2. 我认为这不是很好。没有钩子可用于触发新数据的加载,此外,仅在访问状态后,状态才会清除。
  3. 这似乎不是广播状态的好用例,除非集群中的每个人都需要知道所有证券的收盘价。