規則引擎將「業務規則」從程式碼中剝離,以資料驅動方式執行。核心價值:業務邏輯外部化、動態修改、非技術人員可維護、版本化/審計/測試獨立於應用發布。
Charles Forgy 1979 年發明,解決「大量規則 × 大量事實」的高效匹配問題。
Fact) 容器LHS (條件) → RHS (動作)Account(balance > 1000))KieSession (有狀態/無狀態)insert(fact) / update(handle) / delete(handle)fireAllRules() / fireUntilHalt()javax.rules 定義 RuleServiceProvider、RuleAdministrator、RuleRuntime、RuleSession。現代 Drools/Kie 直接使用原生 API (KieServices、KieContainer、KieSession),功能更豐富。
org.drools
drools-core
9.0.0
org.kie
kie-api
9.0.0
org.kie
kie-ci
9.0.0
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
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()); // 限量手提袋
Excel/CSV 定義規則矩陣,業務分析師直接維護,Kie 讀取編譯。適合參數化規則 (稅率、費率、分級)。
[when]客戶是 VIP = Customer(vip == true)
[then]給予 {discount} 折 = $o.setDiscount({discount});
降低業務與技術溝通門檻。
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
支援時間窗口、事件序列、相關性偵測。
eval() / 反射呼叫index (Hash/Map) 加速單一屬性查找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 生態工具鏈,讓業務規則真正成為資產而非負債。