規則引擎開發

2021-09-01 17:58:29 字數 2405 閱讀 7776

最近兩個月以來,一直在開發公司的規則引擎系統,起初是想把引擎用到crm系統中,後來經過多次討論、多次變更,領導決定把這個規則引擎做成中介軟體,在平 臺的高度來使用他。做成中介軟體,對規則引擎的要求更高了,這需要引擎具備高靈活性和伸縮性,來適應不同的業務系統。下面我來談談開發過程中我的一些經驗。

接下來,我開始了解需求,初步規劃規則引擎,在了解完各個系統的業務需求後,我大致定了下規則引擎要做的事情以及引擎與其他 系統的邊界。由於各個系統之間差異比較大,要讓引擎高可擴充套件,需要對需求進一步抽象,業務系統與規則引擎之間是通過模型來互動的,所以我們單獨將模型抽象 出來,在引擎中可以對模型進行管理。另外乙個需要抽象的地方就是規則的動作部分,由於每個系統資料庫、業務的差異性,動作是不可能統一的,將動作抽象為動作型別,並可以單獨管理,當有新系統接入引擎時,我們為其定義新的動作型別即可。

引擎有了初步規劃後,我開始了解drools,結合drools的特點進一步規劃引擎。drools的官方文件上提供了很詳細的例子來供我們入門,這裡不再贅述入門級別的**。我需要列舉一下自己的引擎中需要實現的功能並在drools中找到解決方案:

1.規則有效期

drools中的date-effective和date-expires生來就是幹這個的。

2.基於cron的定時任務

drools中的timer可以實現,並且官方例子很詳細。

3.規則返回結果

drools中的globle很適合。

4.規則優先順序

可以使用salience來解決。

5.計算類的屬性

對於一些需要預處理的屬性,我們可以不定義字段,而是直接定義乙個無引數的方法,具體可以參考這篇文章的4.8.3.1.1.1節。

6.規則的與或關係

這是drools天生就支援的,並且是完美支援。

掌握了基本的技術點後,我開始設計規則的建立頁面,整個規則引擎大致的思路是:把前端使用者輸入的語言(通俗易懂的白話語言)作為輸入,經過一系列處理轉換後,儲存到資料庫(我們特殊處理的語言)。在規則執行的時候,我們再從資料庫拿出儲存在資料庫的「語言」,然後轉換為drools語言。只所以不把前端使用者的輸入直接轉換為drools語言,是因為我們的場景、屬性、動作型別都是可以靈活變動的,如果建立之初就進行轉換,會導致之後的擴充套件異常困難。

規則的建立頁面包含規則的名稱、有效期、條件資訊和動作資訊等,條件部分我們允許使用者選擇實體(模型)屬性並可以對屬性做四則運算或者與或關係,這樣在保 證引擎的強大之時卻不失簡單之美。為了保證條件的正確性,系統需要在儲存規則之前對使用者輸入的條件進行正確性檢驗。動作的建立首先是需要選擇動作型別,然 後根據定義好的動作型別去輸入相應的內容,這塊還涉及到一些其他知識,比如靜態變數和動態變數,這裡不再展開細說。

上面說了,引擎的核心工作其實就是轉換。我們需要把自己的語言轉換為drools語言,這裡面就涉及到很多字串的拼裝,接下來我談談這部分工作的經驗:

1.使用stringbuilder進行拼裝,並且注意對拼裝規則進行格式化(比如在每行後面換行,這樣方便我們除錯與排錯)。

2.巧用正規表示式,比如我們要得到兩個@之間的字串,可以使用下面的**:

1

2

3

4

5

matcher m=pattern.compile("\\#(.*?)\\#").matcher(str);

listlist =newarraylist();

while(m.find())

3.以drools規則語言的標準來組織程式,做到有條不紊。在**關鍵部分多打log,方便除錯。

完成引擎的解析工作後,剩下的部分就容易多了,無非是一些crud的工作,比如對場景的管理、場景中實體的管理、角色的管理等等。

引擎開發工作持續了將近乙個月,接下來進入測試階段。我們需要根據壓測結果對引擎核心**進行優化重構,這部分我主要借助visualvm和 jconsole,在壓測的同時使用visualvm進行cpu取樣,然後進行分析。經過幾輪的測試,我發現之前自己的**中有很多的不嚴謹之處,比如:

1.使用statefulknowledgesession後沒有呼叫dispose方法去釋放記憶體資源,這一錯誤會讓引擎不停的記憶體溢位。

2.沒有對knowledgebase進行快取,而是對字串進行快取。由於沒有對knowledgebase進行快取,每次請求到來之時都需要重新編譯規則,而規則編譯的成本相當高,沒有對**修正之前,給引擎300左右的併發cpu負載就到了10,而修正後,300的併發cpu負載沒有超過1。

3.沒有關閉reader流,這個就太粗心了,幸好及時發現。

再剩下就是一些其他方面的優化,比如tomcat、mysql等,和主題無關,我留在心裡。

mysql 規則引擎 為什麼使用規則引擎?

一天,朱斯參加了一場code review研討會。會上的一群人正在討論著如何對祖傳 進行變更,大家你一言,我一語,場面十分熱鬧!突然,只見人群中的乙個人滿面愁容,說道 昨天在專案中看到下面這樣一段 分支太多了!維護起來很煩啊!if day 周一 else if day 周二 else if day ...

規則引擎pyke

1.官網 2.安裝第三方包 pyenv global anaconda3 4.2.0 pip install htmltemplate 3.原始碼安裝pyke pyenv global anaconda3 4.2.0 cd pyke3 1.1.1 python setup.py build pyth...

規則引擎 easy rules

直接看官方的例子。經典的例子 大致的步驟 建立各種規則,即rule.可以通過 pojo 或 rulebuilder api 兩種方式建立。建立規則容器rules rules new rules 註冊建立的規則rules.add rule 建立流,即facts.流控制規則的引數輸入.facts fac...