規則引擎核心架構(基於專家系統 RBES)
三大核心元件:
- Rule Base(規則庫):儲存業務規則(條件 → 動作)。
- Working Memory(工作記憶體):存放事實物件。
- Inference Engine(推理引擎):包含模式匹配器、議程、執行引擎。
推理機制
- 前向鏈結:從事實出發,匹配規則觸發動作,產生新事實,循環至無規則可觸發。Rete 算法為最高效實現。
- 後向鏈結:從目標假設反向尋找支撐事實。
引擎執行週期
- 事實放入 Working Memory。
- Pattern Matcher 比對規則條件與事實。
- 衝突規則進入 Conflict Set。
- 衝突解決策略決定優先序,放入 Agenda。
- 執行引擎依序執行 Agenda 動作,可能修改事實 → 回步驟 2。
Java 規則引擎關鍵構件
- Information Unit(信息元):封裝事件完整資訊(訊息、來源、時間、類型、規則集等)。
- Information Service(信息服務):產生特定類型的信息元。
- Rule Set(規則集):多條規則組合,每規則含條件過濾器(布林組合)與動作序列。特殊動作:
Discard(捨棄後續規則並銷毀信息元)、Include(遞歸納入其他規則集)。
- Queue Manager(隊列管理器):管理多信息服務產生的信息元隊列。
Java 規則引擎內部流程
- 從 Queue Manager 取信息元。
- 按定義順序檢查其 Rule Set 中規則條件。
- 條件為真 → 依序執行動作;為假 → 跳過。
- 遇
Discard → 跳過剩餘規則,銷毀信息元,取下一個。
- 遇
Include → 暫停進入被納入規則集,執行完返回繼續。
- 規則集執行完 → 銷毀信息元,處理下一個。
引擎內部維護 Working Memory、規則執行隊列、靜態規則區,事實變更動態調整隊列,形成資料驅動的鏈式反應。
Rete 算法:高效模式匹配
1982 年 Charles Forgy 發明,將規則條件編譯為網狀結構,事實進入時增量計算,避免重複評估。商業級引擎(Drools、IBM ODM、JRules)皆採用 Rete 或其變體。
JSR-94:Java 規則引擎標準 API
兩大 API 類別
- 規則管理 API(
javax.rules.admin):載入規則集(XML/Stream/Reader)、註冊/註銷 RuleExecutionSet、權限控管、本地/遠端提供者。
- 運行時客戶 API(
javax.rules):建立 RuleSession(有狀態/無狀態)、加入/更新事實物件、執行規則、取得結果。類似 JDBC,屏蔽廠商差異。
核心介面
RuleServiceProvider:廠商實現入口,透過 RuleServiceProviderManager 註冊(如 JDBC DriverManager)。
RuleSession:有狀態保持事實跨多次執行;無狀態單次輸入輸出。
RuleExecutionSetMetaData:查詢規則集中繼資料。
安全與異常
- 安全整合 JAAS/JCE/JSSE,在
RuleExecutionSet 定義權限。
- 異常體系根類
javax.rules.RuleException,皆為受檢異常。
- 建議使用 Java Logging API 記錄日誌。
應用場景與價值
- 頻繁變動的業務規則(促銷、風控、定價)外部化,熱部署無需重啟。
- 業務邏輯與技術實現分離,業務分析師可直接維護規則。
- 頁面流程、驗證邏輯同樣可規則化,提升系統靈活度。
結語
規則引擎以 Rete 算法解決模式匹配效能,JSR-94 提供廠商中立 API,是構建靈活、可維護企業應用的關鍵技術。選型時可考慮 Drools(開源)、IBM ODM、Red Hat Decision Manager 等成熟產品。