问题陈述: 尝试评估Apache Flink以建模高级实时低延迟分布式分析
用例摘要: 为仪器I1,I2,I3等提供复杂的分析,每个仪器都有产品定义P1,P2,P3;配置有用户参数(动态)U1,U2,U3&amp;需要流媒体市场数据M1,M2,M3 ...... 仪器分析功能(A1,A2)在计算复杂性方面很复杂,其中一些可能需要300-400ms但可以并行计算。 从上面可以清楚地看出,市场数据流将比分析功能和数据流快得多(<1ms)。需要消耗最新的一致市场数据进行计算。 下一个挑战是多个Dependendant Enrichment功能E1,E2,E3(例如Risk / PnL),它将流媒体市场数据与仪器分析结果(例如价格或收益率)相结合 最后的挑战是计算的一致性 - 因为函数A1可能比A2快,并且需要从给定的市场输入得到一致的所有仪器结果。
计算图依赖示例(将其扩展到数百个工具和10-15个市场数据源):
如果上面的图像不可见,图依赖流程就像:
- M1 + M2 + P1 =&gt; A2
- M1 + P1 =&gt; A1
- A1 + A2 =&gt; E2
- A1 =&gt; E1
- E1 + E2 =&gt;结果编号
问题:
正确设计/模型这些计算数据流,目前我使用ConnectedStreams(P1 + M1),另一种方法可能是使用迭代模型再次向自己提供相同的仪器静态数据?
面对在计算中仅使用最新市场数据事件的问题,因为分析功能(A1)比市场数据(M1)流慢很多。 因此,下一次迭代需要陈旧的市场数据驱逐,保留那些没有价值的地方(LRU缓存就好)
需要同步/关联不同时间复杂度的函数执行,以便迭代2仅在迭代1中的所有内容完成时启动
答案 0 :(得分:4)
这是一个相当广泛的问题,为了更准确地回答,人们需要更多细节。
以下是一些想法,我希望这些想法可以帮助您找到一个好的方向并帮助您处理您的用例:
按键连接的流(a.keyBy(...).connect(b.keyBy(...))
是最强大的类似连接或联合的原语。在连接的流上使用CoProcessFunction
可以让您灵活地根据需要关联或连接值例如,您可以在状态中存储来自一个流的事件,同时等待匹配事件从另一个流到达。
只需将该值置于CoFlatMapFunction
或CoProcessFunction
的状态即可轻松保存一个输入的最新数据。对于输入1中的每个事件,您将事件存储在状态中。来自流2的每个事件,您将查看状态以从流1中找到最新事件。
要按时同步,您实际上可以查看使用事件时间。事件时间也可以是“逻辑时间”,仅表示版本号,迭代次数或任何内容。您只需要确保分配的时间戳和生成的水印一致反映。
如果您按事件时间窗口,那么您将获得该版本的所有数据,无论一个运算符是否比其他运算符更快,或者事件是通过具有不同延迟的路径到达的。这就是真实事件时间处理的美妙之处: - )