上下文如下:
有一个输入事件流,
有一些方法可以应用于流,这些方法应用不同的逻辑来评估每个事件,说它是“好”或“坏”事件。
一个事件只有通过所有的方法才能成为真正的“好”事件,否则它就是“坏”事件。
有一个输出事件流,它具有事件的结果及其eventid。
为了解决这个问题,我有两个想法:
我们可以将每个方法依次应用于每个事件。但这是一种批处理,不适用于流处理的优点,同时需要时间(m(method)1)+时间(m2)+时间(m3)+……,可能不适合实时处理。
我们可以将输入流传递给每个方法,然后我们可以并行运行每个方法,每个方法将坏事件保存到一个永久存储器中,然后主方法可以查询永久存储器以获得每个事件的结果。但这有一些问题需要解决:
如何在编程语言(如scala)中并行执行方法,性能如何(网络、CPU、内存)
如何解决同步问题?当然,这些方法需要一些时间来计算标志并将其保存到永久存储器中,但是main只需要较少的时间来查询标志,因此会出现延迟问题。
等。
这不是一个技术和设计的问题,我想问一下你们的想法,如果你有一些新的想法或想法来解决这个问题?期待您的意见。
1条答案
按热度按时间fafcakar1#
并行流,每个流都按顺序执行完整的评估集,是更直接的解决方案。但是,如果这引入了太多的延迟,那么您可以将要并行执行的评估扇出,然后将结果再次组合在一起以做出决定。
要进行扇出,请查看datastream上的split操作,或者使用side输出。但在执行此n向扇出操作之前,请确保每个事件都有一个唯一的id。如果需要,请向每个事件添加一个包含随机数的字段以用作唯一id。稍后,我们将使用此唯一id作为键来收集每个事件的所有部分结果。
一旦事件流被拆分,流的每个副本都可以使用mapfunction来计算其中一个求值方法。
将给定事件的所有这些单独的评估集合在一起要复杂一些。这里一个合理的方法是将所有结果流合并在一起,然后通过上面描述的唯一id对合并后的流进行键控。这将汇集每个事件的所有单个结果。然后您可以使用richflatmapfunction(使用flink的键控托管状态)在一个地方收集单独评估的结果。一旦给定事件的完整计算集到达这个有状态的flatmap操作符,它就可以计算并发出最终结果。