バックエンド
EQL を実行する実装体は2つあり、ランタイムで動作するのは常に1つです。
| バックエンド | 役割 | 時期 |
|---|---|---|
| Aster CEP | 基本・基準実装 | 一般的なインストール |
| Flink | オラクル — 運用には使用しません | 同一文の回答を照合する用途 |
選択基準はインストール規模です。一般的なインストールは Aster CEP であり、大量ストリーミング用の枠組みが Flink です。ただし、現在は運用に投入しません。
Aster CEP が言語を定義するわけではありません。 言語の範囲は共通 IR が決定し、Aster CEP はそれを最も広く実行する実装です。Flink で不可能だからといって、言語から機能を削除することはありません。
Aster CEP は KOPENS がソースレベルで開発・維持している CEP エンジンです。SQL:2016 MATCH_RECOGNIZE の連続量化子(* + ? {n,m})をエンジン内で実装し、期待値は Flink 2.3.0 と照合しました。
選択方法 — 1行で設定します
plantpulse-cep.properties の1行でプランナーとランタイムを同時に選択します。
cep.backend=aster # aster | flink
| 値 | 意味 |
|---|---|
aster | 基本 — Aster CEP |
flink | オラクル — 運用には使用しません |
| 設定なし | aster として表示されます |
静かにデフォルト値へ移行すると、運用者が選択したものと実際に動作しているものが異なり、その差は結果に異常が出るまで表面化しません。
cep.backend=esper も同様です。この値は存在しません。アップグレードノートを参照してください。
cep.mode — 移植性を«問う»方法
#cep.mode=native # native | portable. 설정하지 않으면 native
| モード | 登録条件 |
|---|---|
native (基本) | ブートしたバックエンドが受け入れれば登録されます。そのエンジン固有の機能を使用しても構いません |
portable | ブートしたバックエンドおよび移植可能セットのバックエンドも受け入れる必要があります |
移植可能セットは Aster CEP のみです(Flink はオラクルであるためセット外です)。したがって、Aster CEP でブートしたインストールでは portable が他に問う場所はなく、native と同様になります。
どの文が移植可能であるかをテーブルで宣言して保持しません。そのバックエンドのプランナーに実際に問い合わせます。 宣言は古くなりますが、質問は古くなりません。
拒否された場合は、どのバックエンドがどの構成のために拒否したのかが共に記録されます。
portable は問い合わせるプランナーがビルドに含まれている必要があります含まれていない場合、ゲートは**「持っているもので代用して計測する」のではなく、動作自体を拒否します。** 不完全に計測された移植性は、計測しないよりも悪影響を及ぼします。
何がどこで動作するか — 能力マトリクス
2つのバックエンドの回答は生成物として管理されます。ゴールデンコーパスを両方のプランナーに投入して作成した表であり、セルが移動したコミットがその表も同時に移動させなければ通過しません。
| Aster CEP (基準) | Flink (オラクル) | |
|---|---|---|
| 言語が実際に 127件中 ✓ | 106 | 53 |
読み方:
| 記号 | 意味 |
|---|---|
| ✓ | プランナーが計画を提示しました (Aster CEP は実際のエンジンがコンパイルまで) |
| ✗ トークン | 名前を提示して拒否しました |
| — | 言語が実装できませんでした — エンジンの回答ではありません |
— は言語がその構成を知らないという意味であり、✗ は言語は知っているがこのエンジンでは動作させられないという意味です。運用者が行うべき対応が異なります。前者は文を書き直す必要があり、後者はその構成を外す必要があります。
2つのバックエンドで差異が出る代表的な箇所
| 構成 | 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 で起動した際にこれらがオンになっており、同じ文が2つのエンジンで動作し、結果が2回出力されました。
現在は、ブートしたバックエンドが Flink でない場合は無視され、ログに一度名前が記録されます。 それでも値自体を整理しておく方が望ましいです。無視されるという事実を後任者が知らない可能性があるためです。