1 CEP-NFA是什么
Flink 的每个模式包含多个状态,模式匹配的过程就是状态转换的过程,每个状态(state)可以理解成由Pattern构成,为了从当前的状态转换成下一个状态,用户可以在Pattern上指定条件,用于状态的过滤和转换。
实际上Flink CEP 首先需要用户创建定义一个个pattern,然后通过链表将由前后逻辑关系的pattern串在一起,构成模式匹配的逻辑表达。然后需要用户利用NFACompiler,将模式进行分拆,创建出NFA(非确定有限自动机)对象,NFA包含了该次模式匹配的各个状态和状态间转换的表达式。整个示意图就像如下:
2 CEP的三种状态迁移边
(1)Take: 表示事件匹配成功,将当前状态更新到新状态,并前进到“下一个”状态;
(2)Procceed: 当事件来到的时候,当前状态不发生变化,在状态转换图中事件直接“前进”到下一个目标状态;
(3)IGNORE: 当事件来到的时候,如果匹配不成功,忽略当前事件,当前状态不发生任何变化。
为了更好地理解上述概念,本文利用下面的代码,构建一个NFA:
//构建链接
patterns Pattern pattern = Pattern.begin("start").where(new SimpleCondition() {
private static final long serialVersionUID = 5726188262756267490L;
@Override public boolean filter(Event value) throws Exception {
return value.getName().equals("c");
}
}).