其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道
开篇先偷一张图,整体了解FlinkCEP中的 一种重要的图 NFA
FlinkCEP在运行时会将用户的逻辑转化成这样的一个NFA Graph (nfa对象)
graph 中包含状态(Flink中State对象),以及连接状态的边(Flink中StateTransition对象)
当从一个State跳变到另一个State时需要通过一条边StateTransition,这条边中包含一个Condition对象包含了用户的逻辑就是我们用户代码中.where()中返回Boolean的方法
也就是说Condition对象中包含是否可以完成状态跳变的条件,A状态要跳变到B状态就必须满足连接AB的边中的条件(边StateTransition对象属于B state)
其中边StateTransition分为三种
take: 状态满足跳变条件后直接跳变到B状态
ignore: 状态满足跳变条件以后又回到原来状态,状态保持不变
process: 这条边可以忽略也可以不忽略
后面源码分析的时候可以看到他们之间的区别
接着从源码来看一下如何用这个NFA图实现Flink中的CEP复杂事件处理的
因为CEP在Flink中被设计成算子的一种而不是单独的计算引擎,所以直接找到CepOperator.java中
来看一下它的初始化Open()
这里看到有一个NFAFactory的工厂创建了一个NFA,这里的这个工厂是在Driver端通过用户编写的代码返回的Patte