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