1. 程式人生 > 程式設計 >打造屬於你的業務規則引擎

打造屬於你的業務規則引擎

規則引擎由推理引擎發展而來,是一種嵌入在應用程式中的元件,實現了將業務決策從應用程式程式碼中分離出來,並使用預定義的語義模組編寫業務決策。接受資料輸入,解釋業務規則,並根據規則做出業務決策。

介紹

規則引擎能夠將業務決策邏輯從系統邏輯中抽離出來,使兩種邏輯獨立於彼此而變化,這樣可以明顯降低兩種邏輯的維護成本。

比如說在物聯網平臺中,連線的裝置種類繁多,資料格式,資料型別不統一,但又要面臨接入新裝置的需求,不能說每接入一種裝置,都要寫一套裝置資料處理的邏輯,然後升級釋出系統的功能,裝置處理邏輯可以寫,但要能最低限度的影響平臺的功能。這個時候,我們最好需要一套規則引擎來靈活的處理各種裝置的資料。

設計

思路

已經知道了為什麼要做規則引擎,要怎麼處理呢,參考QLExpress使用說明文章:www.jianshu.com/p/c1fa9c4a0…

QLExpress是一種Java的規則引擎,可以動態的執行指令碼,並且可以繫結一些我們寫好的Java函式作為動態執行指令碼的操作。那麼我們將資料處理中最通用的內容封裝為一個個QLExpress的元件,在資料處理的時候直接拿來使用即可。其實我們可以考慮只是資料的處理,可能會有哪些元件:

  • 獲取資料點位(屬性)元件,以便快速的獲取資料中的某些想要的部分
  • 反饋元件,在規則執行結束後呼叫系統中的功能,通知業務規則執行完畢
  • 協議元件,可以有http,tcp,udp等,在元件中封裝呼叫地址,資料包,請求地址
  • JSON、XML資料序列化元件,也許會產生新的資料,需要再處理一次

我覺得上面這幾個元件可以滿足大部分的資料場景了,有來源,有處理,有反饋。當然在業務複雜的情況下,可能會不斷的增加新的元件,但是每次增加要想一想,這個元件真的有需要嗎?

另外因為QLExpress已經支援動態指令碼了,具有一定程式語言的特性,足夠的靈活處理,封裝我們的元件只是為了那些更加通用,常用的場景,而最通用的東西一般不會很多。

image-20191012074002421

提供功能

  • 預設的規則元件,以及使用說明
  • 規則的增刪改查介面
  • 規則執行介面
  • 額外暫不考慮

大體流程

1 整理好系統中最常用的功能,進行封裝,將最常用的功能以某種方式(配置檔案,動態載入),註冊為QLExpress的某個操作符上。如下

runner.addFunctionOfClassMethod("取絕對值",Math.class.getName(),"abs",new String[] { "double" },null);
runner.addFunctionOfClassMethod("轉換為大寫",BeanExample.class.getName(),"upper",new String[] { "String" },null);

runner.addFunctionOfServiceMethod("列印",System.out,"println",null);
runner.addFunctionOfServiceMethod("contains",new BeanExample(),"anyContains",new Class[] { String.class,String.class },null);
複製程式碼

2 在不同的業務場景下,編寫QLExpress語句,可以利用上一步註冊到QLExpres上的功能簡化語句。雖然是動態指令碼但是要足夠簡單,業務要做到不用寫幾句程式碼就能滿足這次需求,如果要寫太多的語法,那就有點不太友好了。

3 在每個編寫的規則上,提供規則執行測試指令碼,資料隔離防止產生髒資料,校驗規則指令碼能否正確執行。

4 將規則引擎的功能整合到平臺上。

最後

QLExpress指令碼引擎被廣泛應用在阿里的電商業務場景中,支援常見的程式設計語法,足夠強大,在QLExpress基礎之上打造自己的業務規則引擎。

參考: QLExpress專案 QLExpress使用說明