背景動機
企業級系統面臨業務規則頻繁變更、業務邏輯分散在程式碼各處、非技術人員無法直接維護規則三大痛點。規則引擎將業務決策(規則)與技術實現(代碼)分離,支援運行時動態管理修改,提升系統柔性。
基於規則的專家系統 (RBES) 架構
┌─────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ Rule Base │ │ Working Memory │ │ Inference Engine│
│ (Knowledge │◄────│ (Fact Base) │────►│ (推理引擎) │
│ Base) │ │ │ │ │
└─────────────────┘ └──────────────────┘ └────────┬─────────┘
│
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Pattern │ │ Agenda │ │ Execution │
│ Matcher │ │ (議程/排程) │ │ Engine │
│ (模式匹配) │ │ │ │ (執行引擎) │
└─────────────┘ └─────────────┘ └─────────────┘
- 正向鏈:從事實出發,匹配規則 → 推導結論/執行動作。
- 反向鏈:從目標假設出發,尋找支持事實。
規則引擎核心架構
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 應用程式 │────►│ 規則引擎 │────►│ 決策結果 │
│ (提交數據) │ │ (推理) │ │ (動作/結論) │
└──────────────┘ └──────┬───────┘ └──────────────┘
│
┌─────────────┼─────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ 規則庫 │ │ 工作記憶體│ │ 推理引擎 │
│ (Rule │ │ (Fact │ │ (Rete │
│ Repo) │ │ Base) │ │ 算法) │
└─────────┘ └─────────┘ └─────────┘
Rete 算法
- Charles Forgy 1979 年發明,正向鏈最高效算法。
- 核心思想:將規則條件編譯為歧視網路,事實變更時增量傳播,避免重複評估。
- 商業引擎(Drools、IBM ODM、Red Hat Decision Manager、Fair Isaac Blaze Advisor)均基於 Rete/改進版(ReteII、Rete-NT、Phreak)。
主流 Java 規則引擎產品
| 類別 | 產品/專案 | 特點 | JSR-94 支援 |
| 商業 | Drools (Red Hat) | 開源核心、ReteII/Phreak、決策表、DSL、複雜事件處理 (CEP) | 支援 |
| IBM Operational Decision Manager (ODM) | 企業級、決策中心、場景模擬、治理流程 | 支援 |
| Progress Corticon | 無程式碼建模、漸進式部署、雲原生 | 支援 |
| FICO Blaze Advisor | 高效能、金融風控領域深耕 | 支援 |
| Oracle Business Rules | 融合 SOA Suite、BPM、決策服務 | 支援 |
| 開源 | Drools | 最活躍、社群大、Spring/KIE 整合完善 | 支援 |
| Easy Rules | 輕量、註解驅動、無 Rete、適合簡單規則 | 不支援 |
| Mandarax | 反向鏈、多數據源整合、不支援 JSR-94 | 不支援 |
| OFBiz Rule Engine | 反向鏈、基於 JavaCC 解析器、不支援 JSR-94 | 不支援 |
JSR-94 (Java Rule Engine API) 標準
兩大 API 套件
| 套件 | 核心介面 | 職責 |
javax.rules.admin | RuleAdministrator, RuleExecutionSet, RuleExecutionSetProvider | 管理 API:部署/撤銷規則集、註冊/查詢執行集提供者 |
javax.rules | RuleRuntime, RuleSession, RuleServiceProvider | 運行時 API:建立會話、執行規則、添加/移除事實、註冊結果監聽 |
典型使用流程
// 1. 取得管理員
RuleAdministrator admin = RuleServiceProviderManager.getRuleAdministrator("providerId");
// 2. 取得/編譯 RuleExecutionSet (規則集)
RuleExecutionSet res = admin.getRuleExecutionSet("uri", null); // 或從本地檔載入
// 3. 註冊/更新規則集
admin.registerRuleExecutionSet("myRules", res, null);
// 4. 取得運行時
RuleRuntime runtime = RuleServiceProviderManager.getRuleRuntime("providerId");
// 5. 建立會話 (有狀態/無狀態)
RuleSession session = runtime.createRuleSession("myRules", RuleRuntime.STATEFUL, null);
// 6. 提交事實 (Fact)
session.addObject(new Order(...));
session.addObject(new Customer(...));
// 7. 執行規則
session.executeRules();
// 8. 獲取結果/執行動作
// 9. 釋放會話
session.release();
安全性考量
- 規則集部署需權限控管(
RuleExecutionSetProvider 實現自定安全檢查)。
- 運行時沙箱:限制規則中可呼叫的 Java 方法、存取的類別。
- 審計日誌:記錄規則部署、執行、變更歷程。
規則語言標準化
- RuleML:XML 為基礎的規則標記語言,支援推理規則、重寫規則、查詢規則。
- RIF (Rule Interchange Format):W3C 標準,核心方言(Core、BLD、PRD)支援交換。
- DMN (Decision Model and Notation):OMG 標準,決策表、決策需求圖(DRD)、FEEL 表達式語言,現代業務規則建模首選。
- Drools 同時支援 DRL (Drools Rule Language)、DSL、決策表 (Excel/CSV)、DMN。
JSR-94 不足與展望
| 不足 | 說明 |
| 規則語言未標準化 | JSR-94 僅定義 API,規則語言由各廠商自定(DRL、ILOG Rule Language 等),移植困難 |
| 管理 API 偏底層 | 缺乏版本控制、熱部署、A/B 測試、灰度發布等企業級治理功能 |
| 狀態管理模糊 | STATEFUL/STATELESS 會話語義在分散式環境下擴展性差 |
| 生態發展停滯 | JSR-94 最後更新 2006 年,現代雲原生、微服務、Serverless 場景缺乏支援 |
現代替代架構
- 決策即服務:規則引擎獨立部署為微服務(REST/gRPC),應用透過 HTTP 調用,支援多語言、獨立擴縮容。
- DMN + DMN 執行引擎:Camunda DMN Engine、Drools DMN、Signavio,業務分析師可直接建模決策表,開發者僅負責整合。
- 事件驅動規則:Drools CEP / Flink CEP / Esper,處理複雜事件流模式匹配。
- 配置即代碼:以 YAML/JSON 定義規則,GitOps 管理版本,CI/CD 自動部署到規則服務。
總結
規則引擎 = 業務語義 外部化 + 高效推理 (Rete/Phreak) + 運行時熱更新。
JSR-94 提供了歷史參考標準,但現代架構傾向 DMN 建模 + 微服務化決策引擎 + GitOps 治理。
選型建議:
• 簡單規則、Java 單體 → Easy Rules / Drools 嵌入式
• 複雜決策、需業務自維護 → Drools DMN / Camunda DMN
• 高效能、CEP、分散式 → Drools/KIE Server 叢集或商業 ODM/Blaze
• 多語言、雲原生 → 獨立決策微服務
- 上一篇文章: Java 連接 SQL Server 2000 完整指南:JDBC 驅動、連接字串與常見錯誤排查
- 下一篇文章: Java Draw2D 與 SWT 繪圖實戰:從數據縮放到多序列 XY 圖表繪製
Copyright ©
程式碼之家 All Rights Reserved