跳到主要内容

后端

执行 EQL 的实现有两种,且运行时始终只有一个在运行。

后端位置场景
Aster CEP默认 · 基准实现常规安装
FlinkOracle — 不用于生产用于对照相同语句的答案

选择标准是安装规模。常规安装使用 Aster CEP,而用于大容量流处理的位置使用 Flink — 但目前不投入生产运行。

«基准实现» 的含义

Aster CEP 并不定义语言。语言的范围由公共 IR 决定,Aster CEP 是将其执行范围覆盖最广的实现。不会因为 Flink 无法实现而从语言中删除相关功能。

Aster CEP 是什么样的引擎

Aster CEP 是由 KOPENS 全源代码开发并维护的 CEP 引擎。它在引擎内部实现了 SQL:2016 MATCH_RECOGNIZE 的连续量词(* + ? {n,m}),其预期值已与 Flink 2.3.0 进行了对照。

选择方法 — 仅限一行​

plantpulse-cep.properties 的一行配置将同时选择规划器(Planner)和运行时(Runtime)。

cep.backend=aster # aster | flink
值含义
aster默认 — Aster CEP
flinkOracle — 不用于生产
未设置将显示为 aster
输入错误不会«回退到默认值」,而是会指明名称并停止启动

如果静默回退到默认值,运行的内容将与运行人员选择的不一致,这种差异在结果出现异常之前无法被发现。

cep.backend=esper 同样如此 — 该值不存在。请参阅 升级指南。

cep.mode — «询问» 移植性的方法​

#cep.mode=native # native | portable. 설정하지 않으면 native
模式注册条件
native (默认)只要启动的后端接受即可注册。可以使用该引擎特有的功能
portable必须由启动的后端以及移植可能集合中的后端共同接受

移植可能集合仅包含 Aster CEP 一个(Flink 作为 Oracle 在集合之外)。因此,在以 Aster CEP 启动的安装中,portable 没有更多询问环节,与 native 相同。

并非声明,而是在«注册时询问»

并不通过表格预先声明哪些语句是可移植的 — 而是实际询问该后端的规划器。 声明会过时,但询问不会。

如果被拒绝,将记录哪个后端因为哪个配置而拒绝。

portable 要求构建中必须包含可询问的规划器

如果没有,网关不会«用现有功能代替测量»,而是直接拒绝运行。 半成品般的移植性检查比不检查更糟糕。

运行位置 — 能力矩阵​

两个后端的答案通过生成物进行管理。该表是将黄金语料库全部输入两个规划器后生成的,单元格发生变动的 Commit 必须同步移动该表才能通过。

Aster CEP (基准)Flink (Oracle)
语言实际实现 127 项中 ✓10653

阅读方法:

符号含义
✓规划器生成了计划 (Aster CEP 为真实引擎直至编译)
✗ 令牌指明名称并拒绝
—语言无法实现 — 非引擎层面的答案
请勿将 «—» 与 «✗» 放在同一单元格内

— 表示语言不认识该配置,而 ✗ 表示语言认识但该引擎无法运行。运行人员的处理方式不同 — 前者需要重写语句,后者需要移除该配置。

两个后端产生分歧的代表性位置​

配置Aster CEPFlink
pattern[...]✅部分
缺失模式 not X for 30 min✅❌
MATCH_RECOGNIZE 基本型✅✅
〃 SKIP PAST LAST ROW❌✅
〃 交替 A | B · PERMUTE❌✅
JOIN✅❌
DISTINCT✅ (有条件)❌
ORDER BY · LIMIT✅❌
一元 NOT✅❌
INSERT INTO✅❌
WINDOW TUMBLING … ALIGN TO FIRST EVENT✅❌
WINDOW SLIDING✅❌

完整表格以产品仓库的能力矩阵为准。上方仅列出了经常出现问题的点。

cep.flink.reconciler.enabled=false
cep.flink.router.enabled=false
若开启后以其他后端启动,将导致«重复发布»

这是实际发生过的缺陷 — 使用 Aster CEP 启动但这两个开关开启,导致同一语句在两个引擎中运行,结果发送了两次。

目前,如果启动后端不是 Flink,该配置将被忽略并在日志中记录一次名称。 但建议还是整理好值本身 — 因为后继者可能不知道该值被忽略的事实。

相关文档​