我在apache flink的broadcaststream中有一组规则。当新规则出现在我的事件流中时,我能够应用它们。但如果我的规则是
rule 1> alert when count of event a is greater than 5 in a window of 5 mins
rule 2> alert when count of event a is greater than 4 in a window of 15 mins
我是个新手。我想不通。
我在apache flink的broadcaststream中有一组规则。当新规则出现在我的事件流中时,我能够应用它们。但如果我的规则是
rule 1> alert when count of event a is greater than 5 in a window of 5 mins
rule 2> alert when count of event a is greater than 4 in a window of 15 mins
我是个新手。我想不通。
1条答案
按热度按时间sqyvllje1#
基于flink sql或flink cep的应用程序将无法做到这一点,因为这些库只能处理在编译作业时定义的规则。你将需要为每一个新规则开始一个新的工作,这可能不符合你的要求。
如果希望有一个作业可以处理在作业运行时提供的一组动态规则,则必须自己构建这个作业。你可以使用
KeyedBroadcastProcessFunction
要做到这一点(听起来你已经开始尝试了)。下面是一个可能实现的草图:
您可以在keyedbroadcastprocessfunction中使用keyed状态来跟踪每个窗口中的当前计数。如果规则可以用时间间隔和计数阈值来表示,那么可以使用
MapState
,其中键是规则ID,Map中的值是该规则的当前计数。您可以为每个窗口结束时触发的每个规则设置计时器。当事件到达时,您遍历基于规则的Map,增加每个相关规则的计数器。当计时器启动时,您可以找到相关的规则,将计数器与阈值进行比较,采取适当的操作,然后清除这些计数器。
要记住一些潜在的并发症:
这个实现需要用一个
keyBy
,以便可以使用mapstate和计时器。广播流不能有与之关联的计时器,因此计时器必须由
processElement
处理键控流的方法。flink只允许对给定的密钥和时间戳使用一个计时器。因此,如果您必须处理需要同时触发两个规则的情况,请小心。
如果事件可能无序到达,则需要首先按时间戳对流进行排序,或者允许同时打开多个窗口。