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

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

介紹

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

好比說在物聯網平臺中,鏈接的設備種類繁多,數據格式,數據類型不統一,但又要面臨接入新設備的需求,不能說每接入一種設備,都要寫一套設備數據處理的邏輯,而後升級發佈系統的功能,設備處理邏輯能夠寫,但要能最低限度的影響平臺的功能。這個時候,咱們最好須要一套規則引擎來靈活的處理各類設備的數據。編程

設計

思路

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

QLExpress是一種Java的規則引擎,能夠動態的執行腳本,而且能夠綁定一些咱們寫好的Java函數做爲動態執行腳本的操做。那麼咱們將數據處理中最通用的內容封裝爲一個個QLExpress的組件,在數據處理的時候直接拿來使用便可。其實咱們能夠考慮只是數據的處理,可能會有哪些組件:tcp

  • 獲取數據點位(屬性)組件,以便快速的獲取數據中的某些想要的部分
  • 反饋組件,在規則執行結束後調用系統中的功能,通知業務規則執行完畢
  • 協議組件,能夠有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",new String[] { "String" }, null);
runner.addFunctionOfServiceMethod("contains", new BeanExample(), "anyContains",
            new Class[] { String.class, String.class }, null);
複製代碼

2 在不一樣的業務場景下,編寫QLExpress語句,能夠利用上一步註冊到QLExpres上的功能簡化語句。雖然是動態腳本可是要足夠簡單,業務要作到不用寫幾句代碼就能知足此次需求,若是要寫太多的語法,那就有點不太友好了。spa

3 在每一個編寫的規則上,提供規則執行測試腳本,數據隔離防止產生髒數據,校驗規則腳本可否正確執行。設計

4 將規則引擎的功能集成到平臺上。

最後

QLExpress腳本引擎被普遍應用在阿里的電商業務場景中,支持常見的編程語法,足夠強大,在QLExpress基礎之上打造本身的業務規則引擎。

參考: QLExpress項目 QLExpress使用說明

相關文章
相關標籤/搜索