Flink Core 和 Flink CEP 在能力上有什么区别?

What is the difference between Flink Core and Flink CEP in respect of their capabilities?

这几天在研究 Flink CEP 库的过程中,给我的印象是它并没有在 Flink 的标准能力上增加任何新的基础功能。 Flink CEP 的唯一目的似乎就是让事件处理更简单,语义清晰,代码结构直观。例如,Flink CEP 仅呈现 5 semantics 的事件匹配跳过。尽管这些语义可能足以应对很大范围的情况,但它可能无法解决特定问题,这让我们 return 对 Flink 感到陌生。

测试用例是以下模式:

Emmit a alert(represented by 'a') for each non-overlapping pair of numbers in a stream

由模式表示:

Pattern.begin[EventType]("pair",skipStrategy).where(new AlwaysTrueFunction()).times(2)

因此,对于像(流中从左到右输入的数字)1 1 1 1 1 这样的输入,预期的输出将是 a a,但跳过 5 个匹配项的 none策略会给出正确的结果:

No-skip: a a a a
Skip-to-next: a a a a
Skip-past-last-event: a a a a
Skip-to-first[1]: a a a a
Skip-to-last[1]: a a a a

尽管这些策略无法生成所需的模式,但可以使用 RichFunctionValueState 计数器轻松确定何时应发出新警报,转换输入流在一连串的事件中。

因此,我希望对这些问题有所了解:

感谢您使用 Flink CEP。

Flink CEP 是 Fl​​ink 之上的库。因此,它不会添加任何无法使用 vanilla Flink 实现的功能(ProcessFunctions 等)。事实上,在幕后它是作为一个特殊的操作符来实现的,它正在检查与特定模式匹配的元素,它的大部分功能甚至可以作为 ProcessFunction 来实现(有很多工具)。

也就是说,Flink CEP 可能不会添加普通 Flink 无法实现的功能,但它增加了表现力,使一些用例更容易实现。其他 API 也是如此,例如 Flink 中的 Windowing API,您可以使用 ProcessFunctions(有很多工具)来实现它。

现在说到效率,答案是"it depends"。手工制作一个针对您的用例量身定制的特殊流程函数,并针对您的工作负载进行所有可能的优化,可能比 FlinkCEP 更高效,因为后者是一个通用库。如果您有专业知识和时间,那么最佳解决方案始终是同时使用(CEP 和 vanilla Flink)实施 PoC,并为您的案例选择最有效的。