我在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
我是新手。我无法弄清楚。
答案 0 :(得分:0)
基于flink-sql或flink-cep的应用程序将无法执行此操作,因为这些库只能处理在编译作业时定义的规则。您可能需要为每个新规则开始一个新工作,这可能不符合您的要求。
如果您要拥有一个可以处理作业运行时提供的动态规则集的作业,则必须自己构建该作业。您可以使用KeyedBroadcastProcessFunction
来执行此操作(听起来您已经开始尝试)。
以下是可能的实现方式的草图:
您可以在KeyedBroadcastProcessFunction中使用键控状态来跟踪每个窗口中的当前计数。如果可以通过时间间隔和计数阈值来表征规则,则可以使用MapState
,其中键是规则ID,映射中的值是该规则的当前计数。您可以为在每个窗口结束时触发的每个规则设置一个计时器。
事件到达时,您将循环访问基于规则的映射,为每个相关规则增加计数器。当计时器启动时,您会找到相关规则,将计数器与阈值进行比较,采取适当的措施,然后清除这些计数器。
一些潜在的并发症要记住:
keyBy
对流进行分区,以便可以使用MapState和计时器。processElement
方法来管理计时器。