我在一个股票项目中使用Apache Flink来计算当前的价格变化。公式是
price_change = (current_price - previous_close_price) / previous_close_price
previous_close_price
是证券在交易前一天的收盘价。市场每天开放之前,我需要更新previous_close_price
。
现在我已经提出了几种解决方案,但是我不知道哪个是最好的。
将previous_close_price
存储在Redis中,并在每次计算中获取价格。更新价格既方便又灵活,但是此解决方案可能会降低性能。
将状态TTL设置为1天。旧状态过期时获取新状态。但这不灵活,因为TTL是硬编码的。
Broadcast State Pattern。我不确定该解决方案是否有效。
发送特殊消息到flink。当flink收到消息时,它将更新previous_close_price
。
任何建议都值得赞赏。
答案 0 :(得分:3)
我建议在#4上使用一个变体:
有两个来源,一个仅用于收盘价,另一个用于交易流。通过安全性对两个流进行键控,然后将它们与CoProcessFunction连接。在Key的状态下,将Previous_close_price存储在CoProcessFunction中。
每天在市场开盘前,输入更新后的收盘价。
这可以通过RichCoFlatMap来完成,但我建议您使用CoProcessFunction,因为您可能希望使用侧面输出来报告错误(例如,缺少前收盘价的证券)。
关于其他方法: