什么是規(guī)則引擎
一個業(yè)務(wù)規(guī)則包含一組條件和在此條件下執(zhí)行的操作,它們表示業(yè)務(wù)規(guī)則應(yīng)用程序的一段業(yè)務(wù)邏輯。業(yè)務(wù)規(guī)則通常應(yīng)該由業(yè)務(wù)分析人員和策略管理者開發(fā)和修改,但有些復(fù)雜的業(yè)務(wù)規(guī)則也可以由技術(shù)人員使用面向?qū)ο蟮募夹g(shù)語言或腳本來定制。業(yè)務(wù)規(guī)則的理論基礎(chǔ)是:設(shè)置一個或多個條件,當(dāng)滿足這些條件時會觸發(fā)一個或多個操作。
規(guī)則引擎(rule engine)是指將復(fù)雜的業(yè)務(wù)邏輯抽象成規(guī)則,然后使用特定的算法(比如Rete)對規(guī)則進行求值等操作。簡單點說,規(guī)則引擎就是實現(xiàn)復(fù)雜業(yè)務(wù)邏輯的框架。
為什么要用規(guī)則引擎
在維護和更新項目的業(yè)務(wù)邏輯代碼時,大家深有體會:
- 因編碼風(fēng)格的問題,不同人有不同的代碼實現(xiàn),而造成代碼理解的困難;
- 每一次業(yè)務(wù)邏輯的更改會導(dǎo)致項目的重編譯;
- 為了能實時響應(yīng)更改,而不得不做服務(wù)重啟服務(wù)的無縫銜接
從上面的需求出發(fā),規(guī)則引擎應(yīng)滿足如下特點:
- 腳本化,允許用類Python的腳本語言或DSL來描述規(guī)則;
- 動態(tài)化,實時動態(tài)地加載規(guī)則腳本,規(guī)則的修改能實時地反饋于服務(wù)系統(tǒng);
- 快速的執(zhí)行速度。
2. 實現(xiàn)
已有的開源方案
Drools應(yīng)該是Java界名頭最響、功能最豐富、社區(qū)最活躍的開源規(guī)則引擎了,目前的版本號為6.5.0.Final。淘寶也開源了自己的一套規(guī)則引擎QLExpress,但是似乎在2011年后項目沒有再維護了。相較于QLExpress,Drools設(shè)計一套類DSL的腳本語言,用起來非常爽。但是在我看來,對于特定場景(比如用戶畫像),Drools顯得過于重量級了,而QLExpress設(shè)計的API過于Java化了。
Scal