后端
执行 EQL 的实现有两种,且运行时始终只有一个在运行。
| 后端 | 位置 | 场景 |
|---|---|---|
| Aster CEP | 默认 · 基准实现 | 常规安装 |
| Flink | Oracle — 不用于生产 | 用于对照相同语句的答案 |
选择标准是安装规模。常规安装使用 Aster CEP,而用于大容量流处理的位置使用 Flink — 但目前不投入生产运行。
Aster CEP 并不定义语言。语言的范围由公共 IR 决定,Aster CEP 是将其执行范围覆盖最广的实现。不会因为 Flink 无法实现而从语言中删除相关功能。
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 |
flink | Oracle — 不用于生产 |
| 未设置 | 将显示为 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 项中 ✓ | 106 | 53 |
阅读方法:
| 符号 | 含义 |
|---|---|
| ✓ | 规划器生成了计划 (Aster CEP 为真实引擎直至编译) |
| ✗ 令牌 | 指明名称并拒绝 |
| — | 语言无法实现 — 非引擎层面的答案 |
— 表示语言不认识该配置,而 ✗ 表示语言认识但该引擎无法运行。运行人员的处理方式不同 — 前者需要重写语句,后者需要移除该配置。
两个后端产生分歧的代表性位置
| 配置 | Aster CEP | Flink |
|---|---|---|
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 | ✅ | ❌ |
完整表格以产品仓库的能力矩阵为准。上方仅列出了经常出现问题的点。
Flink 开关仅在以 Flink 启动时有效
cep.flink.reconciler.enabled=false
cep.flink.router.enabled=false
这是实际发生过的缺陷 — 使用 Aster CEP 启动但这两个开关开启,导致同一语句在两个引擎中运行,结果发送了两次。
目前,如果启动后端不是 Flink,该配置将被忽略并在日志中记录一次名称。 但建议还是整理好值本身 — 因为后继者可能不知道该值被忽略的事实。