首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 規則引擎原理與實戰:Rete 演算法、JSR-94 與 Drools 最佳實踐

     編輯:Java 相關知識

什麼是規則引擎?

規則引擎將「業務規則」從程式碼中剝離,以資料驅動方式執行。核心價值:業務邏輯外部化、動態修改、非技術人員可維護、版本化/審計/測試獨立於應用發布。

核心架構:Rete 演算法

Charles Forgy 1979 年發明,解決「大量規則 × 大量事實」的高效匹配問題。

關鍵概念

  • Working Memory (WM):當前所有事實物件 (Fact) 容器
  • Rule Base:規則集合,每條規則 = LHS (條件) → RHS (動作)
  • Alpha Network:單一模式節點過濾 (如 Account(balance > 1000))
  • Beta Network:多模式連接 (Join) 節點,建立部分匹配狀態 (Tuple)
  • Terminal Node:完整匹配 → 啟動規則實例
  • Agenda:衝突集 (激活的規則實例) 排程器,依優先序/ salience 執行

Rete 優勢

  • 增量匹配:事實增刪改只影響局部網路,避免全掃描
  • 共享前綴:相同條件前綴共用 Alpha 節點
  • 記憶部分匹配:Beta 節點保存 Tuple,新事實只需 Join 現有 Tuple

規則生命週期

  1. 編譯期:DRL/DSL/Excel/決策表 → 內部規則模型 → 位元組碼/可執行模型
  2. 啟動期:KieContainer 載入 KieModule → KieBase (規則知識庫)
  3. 執行期:
    1. 建立 KieSession (有狀態/無狀態)
    2. insert(fact) / update(handle) / delete(handle)
    3. fireAllRules() / fireUntilHalt()
    4. 規則 RHS 執行 Java 程式碼 (修改 Fact、呼叫服務、發事件)

JSR-94:標準 API (歷史參考)

javax.rules 定義 RuleServiceProvider、RuleAdministrator、RuleRuntime、RuleSession。現代 Drools/Kie 直接使用原生 API (KieServices、KieContainer、KieSession),功能更豐富。

Drools / Kie 實戰範例

Maven 依賴 (Drools 8.x / Kie 9.x)



    org.drools
    drools-core
    9.0.0


    org.kie
    kie-api
    9.0.0


    org.kie
    kie-ci 
    9.0.0

DRL 規則檔 (src/main/resources/rules/discount.drl)


package com.example.rules;

import com.example.model.Order;
import com.example.model.Customer;

rule "VIP 九折"
    salience 10
    when
        $c : Customer(vip == true)
        $o : Order(customer == $c, totalAmount > 1000)
    then
        $o.setDiscount(0.9);
        update($o);
        System.out.println("VIP 九折套用: " + $o.getId());
end

rule "滿額贈品"
    when
        $o : Order(totalAmount >= 5000, gift == null)
    then
        $o.setGift("限量手提袋");
        update($o);
end

Java 執行程式碼


KieServices ks = KieServices.Factory.get();
KieContainer kc = ks.getKieClasspathContainer();
KieSession session = kc.newKieSession("ksession-rules");

Customer vip = new Customer("C001", true);
Order order = new Order("O1001", vip, 6000.0);

session.insert(vip);
session.insert(order);
int fired = session.fireAllRules(); // 返回觸發規則數
session.dispose();

System.out.println("Discount: " + order.getDiscount()); // 0.9
System.out.println("Gift: " + order.getGift());        // 限量手提袋

進階主題

1. 決策表

Excel/CSV 定義規則矩陣,業務分析師直接維護,Kie 讀取編譯。適合參數化規則 (稅率、費率、分級)。

2. 領域特定語言 (DSL)


[when]客戶是 VIP = Customer(vip == true)
[then]給予 {discount} 折 = $o.setDiscount({discount});

降低業務與技術溝通門檻。

3. 複雜事件處理 (CEP)


rule "連續三次登入失敗 10 分鐘內鎖定"
    when
        $l1 : LoginFail($u : user, $t : time)
        $l2 : LoginFail(user == $u, time after[0, 10m] $t)
        $l3 : LoginFail(user == $u, time after[0, 10m] $l2.time)
    then
        $u.lock();
end

支援時間窗口、事件序列、相關性偵測。

4. 效能調優

  • 避免大量 eval() / 反射呼叫
  • 善用 index (Hash/Map) 加速單一屬性查找
  • 分割 KieBase:高頻/低頻規則分離、獨立 KieSession
  • 無狀態 StatelessKieSession 適用單次評估、無副作用場景
  • 啟用 MVEL / Executable Model (Drools 7.30+) 提升編譯/執行速度

選型建議

場景推薦方案
輕量、規則少、頻繁變更Easy Rules、Aviator、Expression Language (SpEL/MVEL)
企業級、複雜規則、決策表、CEP、審計Drools / Kie (紅帽支援、社群活躍)
雲原生、微服務化、多語言OpenL Tablets、Camunda DMN、自建 Rule-as-a-Service (gRPC/REST)
.NET 生態RulesEngine、NRules

結語

規則引擎不是銀彈。適用於「規則多變、業務主導、需追溯」場景;核心演算法 Rete 以空間換時間,記憶體壓力大時需分片。引入前務必評估:團隊能否維護 DRL/決策表、測試策略、版本發布流程。善用 Kie 生態工具鏈,讓業務規則真正成為資產而非負債。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved