一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

規(guī)則引擎深度對比,LiteFlow vs Drools!

jf_ro2CN3Fa ? 來源:稀土掘金 ? 2023-04-20 18:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Drools是一款老牌的java規(guī)則引擎框架,早在十幾年前,我剛工作的時候,曾在一家第三方支付企業(yè)工作。在核心的支付路由層面我記得就是用Drools來做的。

難能可貴的是,Drools這個項目在十幾年后還依舊保持著開源和更新。

而LiteFlow也是一款java規(guī)則引擎,于2020年開源。經過2年的迭代,現在功能和特性也非常棒,很適合用在高復雜度的核心業(yè)務上,同時又能保持業(yè)務的靈活性。

這篇文章我們就來深入比較下這兩款框架,都適合用在什么樣的場景,有什么異同點,以及在相同的場景下表現力如何。

(其中Drools基于7.6.0版本,LiteFlow基于2.9.0版本)

雖然題主就是開源項目LiteFlow的作者,但是我這幾天也深入了解了下Drools,盡量從很客觀的角度嘗試去分析。很多比對的結果都是基于實際使用后的感受。不過題主難免會帶有一些主觀的心理以及了解的片面性,尤其是Drools現在已經更新到了8.X。

規(guī)則引擎的定義

首先我想明確下規(guī)則引擎的定義,因為很多小伙伴容易把規(guī)則引擎和流程引擎的概念混在一起。

規(guī)則引擎通常是嵌入在應用程序組件中的,實現了將業(yè)務決策從應用程序代碼中分離出來,并使用預定義的語義模塊編寫業(yè)務決策。接受數據輸入,解釋業(yè)務規(guī)則,并根據業(yè)務規(guī)則做出業(yè)務決策。

簡單來說就是,規(guī)則引擎主要解決易變邏輯和業(yè)務耦合的問題,規(guī)則驅動邏輯。以前項目內寫死在代碼里的邏輯用規(guī)則引擎可以提出來,隨時熱變更。

而流程引擎實現了將多個業(yè)務參與者之間按照某種預定義的規(guī)則進行流轉,通常需要涉及到角色信息。

簡單來說就是,流程引擎主要解決業(yè)務在不同角色之間的流轉問題,如請假流程,審批流程,往往要經過多個角色。規(guī)則驅動角色流轉。

兩款框架的異同點

Drools和LiteFlow都是優(yōu)秀的開源框架,都能把業(yè)務中的邏輯給剝離出來。并且擁有自己表達式語法。

但是有所區(qū)別的是,Drools強調邏輯的片段規(guī)則化,你可以把核心易變部分寫成一個規(guī)則文件,等同于原先寫在java里的代碼現在搬遷到了規(guī)則文件。規(guī)則文件里的代碼全都是可以熱變更的。

而LiteFlow是基于組件式的思想設計的,更強調組件的規(guī)則化,覆蓋范圍是整個業(yè)務。編排的最小單位是組件,規(guī)則文件用來串聯組件間的流轉。同時LiteFlow也支持片段式的代碼規(guī)則化,因為LiteFlow也支持業(yè)務邏輯的腳本化。規(guī)則支持熱變更。

所以評判一個規(guī)則引擎是否合格的主要因素有:

有沒有靈活的規(guī)則表達式來支持

規(guī)則和Java之間能否非常方便的聯動

API調用是否方便,和各種場景系統的集成如何

侵入性耦合比較

規(guī)則的學習成本,是否容易上手

規(guī)則表達式是否有語言插件

規(guī)則能否和業(yè)務松耦合,存儲于其他地方

規(guī)則的變更能否實時改變邏輯

是否有界面形態(tài)來支持非技術人員的使用

框架的性能表現

下面就從這幾個方面來細細比較兩款框架的表現力

規(guī)則表達式

Drools的規(guī)則表達式為Java量身定制的基于Charles Forgy的RETE算法的規(guī)則引擎的實現。

Drools的規(guī)則表達式貼近自然編程語言,擁有自己的擴展名文件drl,語法支持全,基本上自然編程語言有的語法drl全有。所以,完全可以把java的邏輯寫在drl文件中。

來看下drl文件的大體樣子:

5e44964e-d5c2-11ed-bfe3-dac502259ad0.jpg

drl文件

可以看到,Drools定義規(guī)則的方式是一個規(guī)則一段,有明確的when...then,表示當滿足什么條件時,做什么。關注公z號:碼猿技術專欄,回復關鍵詞:1111 獲取阿里內部Java性能優(yōu)化手冊!在觸發(fā)規(guī)則時候,會自動判斷該去執(zhí)行哪一段rule,如果滿足多個條件,是可以觸發(fā)多個規(guī)則的then的。

LiteFlow編排表達式簡單易懂,底層用EL表達式語言包裝而成。用于組件的流轉,支持異步,選擇,條件,循環(huán),嵌套等一些場景。

組件層面不僅可以是java組件,還可以用腳本語言來編寫,目前支持了Groovy和QLExpress兩種腳本語言。所有能用java實現的,用腳本語言都可以做到。

LiteFlow的規(guī)則文件大體長這個樣子:

5e619366-d5c2-11ed-bfe3-dac502259ad0.jpg

LiteFlow的規(guī)則文件

上述LiteFlow的編排表達式中,所表達的是下面一個邏輯流:

5e73973c-d5c2-11ed-bfe3-dac502259ad0.jpg

LiteFlow的編排表達式

LiteFlow編排表達式支持THEN(同步),WHEN(異步),SWITCH(選擇),IF(條件),FOR(次數循環(huán)),WHILE(條件循環(huán))等大表達式,每個表達式又有許多擴展關鍵字可供選用。

腳本組件支持的Groovy基本和java語法差不多,Groovy語言支持的一切你均可使用。甚至可以在Groovy語法中額外定義類和方法。

「結論」

總的來說,兩款框架都能用腳本來定義邏輯片段,在定義邏輯片段層面,Drools使用的是自研語法,LiteFlow使用的是插件式的Groovy,其實個人覺得Groovy更接近java語法,你甚至于可以在其中定義類和方法。Drools在高級應用中,也可以用規(guī)則定義方法,但是我覺得并不那么自然。

LiteFlow最大的特點是除了定義邏輯片段外,還可以進行全局組件的編排。而這正是LiteFlow稱之為編排式規(guī)則引擎的由來。使用簡單的編排語法可以設計出復雜的邏輯流。支持java和腳本混編。

和Java的數據交換

在Drools的規(guī)則中,你可以通過import關鍵字來引入java的一些類包類進行調用。

在LiteFlow的腳本組件中,Groovy也可以通過import 來引入java的任何包來調用。

Drools中,可以直接引用到fact對象。

LiteFlow中,可以直接引用到context對象,context上下文貫穿整個編排鏈路。

LiteFlow中,通過@ScriptBean注解,你甚至可以把spring上下文中的bean引入進來直接調用。利用這個特性,甚至于可以在腳本中調用rpc,調用數據庫dao對象取數據。這個在Drools里面雖然也可以做到,但是要麻煩的多。

「結論」

基本都能滿足和java的數據交換需求,但是LiteFlow在場景上支持的顯然更加多一點。

API以及集成

在API調用層面,Drools需要去定義KieContainer,KBase,KSession一系列對象。LiteFlow框架只需要使用到LiteFlowExecutor對象。

Drools支持了編程式接入,但是在springboot中需要自己寫很多配置類來去集成。

LiteFlow不僅支持了編程式接入,在springboot環(huán)境下更是提供了自動裝配的starer接入方式,連定義LiteFlowExecutor都不需要,直接從上下文中就可以拿到自動裝配后的對象進行調用。

結論

LiteFlow api更加簡單,同Springboot集成度更加高。

侵入性耦合比較

Drools需要在java代碼里需要用到規(guī)則的地方用KSession對象去匹配規(guī)則進行調用。規(guī)則和java是分離的。在調用層面耦合了KSession調用對象。

LiteFlow的規(guī)則和java也是分離的,但是LiteFlow多了組件這一概念,所以在組件層面是需要繼承的,但是同時也提供聲明式組件的選擇,使用聲明式的方式耦合相對要減少一些。在調用層面也需要去調用LiteFlowExecutor對象。

「結論」

在耦合度上面,由于LiteFlow提供編排特性,API耦合度相對稍高一些。Drools耦合少一些。

規(guī)則的學習成本

Drools的規(guī)則學習成本挺高的。由于是自研的規(guī)則語法,需要一個很全面的熟悉過程。而且文檔全英文。

LiteFlow的編排規(guī)則極其簡單,如果你不使用腳本組件的話,基本上10分鐘即可上手。就算使用了groovy腳本,由于groovy非常類似于java,學習成本也非常少。況且有大量的學習資料可以參閱。

LiteFlow的文檔中英文齊全,還有良好的中文社區(qū)可以答疑解惑。

結論

在規(guī)則學習成本上,Drools的規(guī)則學習曲線比LiteFlow高出不止一丁點。

是否有語言插件

Drools在Eclipse和IDEA上均有插件來做語法的高亮,預檢查和提示。

LiteFlow在IDEA上有插件來做高亮,預檢查和提示。Eclipse上沒有。

結論

考慮到使用eclipse的人幾乎很少了,基本上2款規(guī)則引擎在語言插件上都做到了。

規(guī)則的存儲

Drools的規(guī)則理論上支持你的規(guī)則存于任何地方,但這一切都需要你手動去額外完成。自己去存,自己去取。

Drools還有款workbeanch的插件,可以將規(guī)則存于workbeanch中。只有這個是不需要自己存取的。

LiteFlow除了本地規(guī)則以外,原生支持將規(guī)則存儲于任何標準SQL的數據庫,還原生支持了Nacos,Etcd,zookeeper等注冊中心。只需要配置一下即可。除此之外,還提供了擴展接口,方便你自己擴展成任意的存儲點。

「結論」

LiteFlow的規(guī)則存儲支持比Drools豐富的多。

規(guī)則的變更能否實時改變邏輯

Drools熱刷新規(guī)則的方式現在看起來有點傻,它的規(guī)則是通過生成jar的方式。然后系統遠程動態(tài)讀取jar包來完成規(guī)則刷新的。

而且一定得通過workbench的方式進行規(guī)則的熱變更。

LiteFlow在這個層面做的高級很多。如果你是用Nacos,Etcd,zookeeper等方式存儲,不用做任何事,改變即自動刷新。如果你是SQL數據庫存儲,或者本地存儲。在改變規(guī)則之后,需要調用LiteFlow框架提供的一個API進行熱變更。2種方式均可熱更新。并且在高并發(fā)情況下是平滑的。

「結論」

LiteFlow在熱更新設計層面比Drools先進很多。

是否有界面形態(tài)來支持

Drools有workbench,workbench是一個獨立的插件包,提供了web界面編寫規(guī)則以及fact對象。并提供了檢查和部署的能力。但因為Drools主要關心邏輯片段,并不需要提供編排層面的拖拽UI功能,只是提供了在界面上編寫規(guī)則的能力。

LiteFlow并沒有界面形態(tài)。目前只能通過第三方的Nacos,Etcd提供的界面來輔助完成界面的規(guī)則修改。

「結論」

Drools在UI形態(tài)生態(tài)上領先LiteFlow一截。

框架的性能表現

這里用Drools和LiteFlow實現了同樣的一段邏輯Demo。

根據訂單金額來加積分的Demo案例。

案例邏輯很簡單,根據訂單的金額來動態(tài)判斷該加多少積分:

小于100元,不加積分。

100到500元,加100積分。

500到1000元,加500積分。

1000元以上,加1000積分。

其中Drools的規(guī)則如下:

packagerules;

importcom.example.droolsdemo.entity.Order;

rule"score_1"
when
$order:Order(amount<100)
then
????$order.setScore(0);
????System.out.println("觸發(fā)了規(guī)則1");
end

rule?"score_2"
when
????$order:Order(amount>=100&&amount=500&&amount=1000)
then
$order.setScore(1000);
System.out.println("觸發(fā)了規(guī)則4");
end

其中等價的LiteFlow規(guī)則如下:





=100&&amount=500&&amount




















SWITCH(w).TO(a,b,c,d);


兩款框架都全用腳本來寫的情況下,測試的過程中,去除所有的打印日志,執(zhí)行10w次,得到的結果如下:

Drools 執(zhí)行10w次,耗時0.7秒

LiteFlow全腳本組件執(zhí)行10w次,耗時3.6秒

由于LiteFlow在全腳本組件的情況下,需要做腳本的執(zhí)行和編排腳本的執(zhí)行,所以花費的時間更長。

如果LiteFlow把組件更換成java,再進行執(zhí)行,得到的結果如下:

LiteFlow 全Java組件執(zhí)行10w次,耗時0.5秒

結論

如果LiteFlow采用全腳本的方式運行,耗時會比Drools更長。如果采用全java組件的方式運行,其性能能超越Drools一點。

所以對于LiteFlow而言,如果你希望更高的性能,則采用java組件,如果你希望更高的靈活性,則采用腳本組件。

其實在實際業(yè)務中,把容易更改的邏輯抽出來寫成腳本組件,采用java+腳本混編的方式,是更為推薦的做法。

結語

為什么會拿Drools來作為比較,其一在題主心中,Drools一直是規(guī)則引擎界的標桿,drools有很多理念非常值得學習。其二也是因為題主也只熟悉Drools,其他的框架沒有很好的使用過的緣故。

但是綜合來看,作為國產規(guī)則引擎后起之秀LiteFlow顯然在設計理念,支持度方面是要優(yōu)于Drools的。編排式規(guī)則引擎作為規(guī)則引擎的一個新的方向,也會一直探索下去的。希望大家能多多支持這款國產的規(guī)則引擎。在編排方向,LiteFlow除了文中所提到的一些特性以外,還有很多其他各種各樣的探索性的玩法和高級特性。是一款很值得深挖的框架。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    20

    文章

    2989

    瀏覽量

    109784
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11887
  • 編程語言
    +關注

    關注

    10

    文章

    1956

    瀏覽量

    36665
  • API接口
    +關注

    關注

    1

    文章

    85

    瀏覽量

    10886

原文標題:規(guī)則引擎深度對比,LiteFlow vs Drools!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    信而泰×DeepSeek:AI推理引擎驅動網絡智能診斷邁向 “自愈”時代

    DeepSeek-R1:強大的AI推理引擎底座DeepSeek是由杭州深度求索人工智能基礎技術研究有限公司開發(fā)的新一代AI大模型。其核心優(yōu)勢在于強大的推理引擎能力,融合了自然語言處理(NLP)、
    發(fā)表于 07-16 15:29

    CES Asia 2025 低空經濟專館:思想碰撞,引領低空經濟規(guī)則升級

    力量的齊聚,形成了一個強大的產業(yè)規(guī)則創(chuàng)新引擎,為低空經濟產業(yè)規(guī)則的升級提供源源不斷的動力。 多場高端研討,深度剖析產業(yè)發(fā)展關鍵議題 政策與監(jiān)管創(chuàng)新:優(yōu)化政策環(huán)境,推動產業(yè)合規(guī)穩(wěn)
    發(fā)表于 07-04 17:04

    主流版本控制工具Git vs Perforce P4:架構模式、性能、大文件管理及分支管理對比詳解

    Git vs Perforce P4,如何選型?架構模式、性能、大文件管理、分支策略四大維度對比,幫你全面了解兩者的核心差異,選擇更合適你團隊需求的版本控制系統。
    的頭像 發(fā)表于 06-13 14:52 ?205次閱讀
    主流版本控制工具Git <b class='flag-5'>vs</b> Perforce P4:架構模式、性能、大文件管理及分支管理<b class='flag-5'>對比</b>詳解

    小米玄戒O1 vs 蘋果A18 全面對比分析

    小米玄戒O1 vs 蘋果A18 全面對比分析 一、技術架構與工藝制程 維度 小米玄戒O1 蘋果A18 制程工藝 臺積電第二代3nm(N3E) 臺積電3nm(N3E) CPU架構 十核四叢集設計:2
    的頭像 發(fā)表于 05-23 15:20 ?1025次閱讀

    接地電阻柜vs其他接地方式對比

    接地電阻柜vs其他接地方式對比: 接地方式原理優(yōu)點缺點 中性點不接地無中性點接地設備成本低,簡單易引發(fā)弧光過電壓 電阻接地串接電阻限制電流抑制過電壓保護設備,需定期維護電阻片 消弧線圈電感補償接地電流自動調諧,適合架空線對電纜系統效果差 直接接地中性點直接接地故障電流大,
    發(fā)表于 05-20 08:52

    泰克3系與5系示波器存儲深度對比測試

    示波器作為電子測試的核心工具,其存儲深度直接影響信號采集的精度與數據分析能力。本文聚焦泰克3系與5系示波器,從存儲深度、采樣率、波形捕獲率等關鍵參數出發(fā),結合應用場景與功能對比,解析二者在不同測試
    的頭像 發(fā)表于 04-22 15:57 ?253次閱讀
    泰克3系與5系示波器存儲<b class='flag-5'>深度</b><b class='flag-5'>對比</b>測試

    2025年村田電感型號命名規(guī)則深度解析

    在電子元器件領域,村田作為全球知名的制造商,其電感產品憑借卓越性能和穩(wěn)定品質,廣泛應用于通信、消費電子、汽車電子等行業(yè)。隨著技術迭代,村田在2025年對電感型號命名規(guī)則進行了系統性優(yōu)化,將深入解析其
    的頭像 發(fā)表于 04-15 14:29 ?593次閱讀

    機智云出席火山引擎AIoT智變浪潮高峰論壇

    近日,在火山引擎主辦的“AIoT智變浪潮”高峰論壇上,機智云作為火山引擎的重要合作伙伴受邀出席并展示了最新的AI+IoT技術產品。憑借深厚的行業(yè)積累與技術實力,機智云與諸多AI硬件領域的頭部企業(yè)展開
    的頭像 發(fā)表于 04-08 14:10 ?403次閱讀

    摩爾線程與當虹科技達成深度合作

    近日,摩爾線程與當虹科技達成深度合作,基于國產GPU成功完成了與BlackEye多模態(tài)視聽大模型的深度融合。雙方聯手打造專業(yè)級視聽“引擎”,并在超高清GPU算力場景中成功落地。
    的頭像 發(fā)表于 03-20 15:22 ?601次閱讀

    淺談VS系列電壓傳感器

    VS系列電壓傳感器 是一種量程覆蓋35kV及以下的直流、交流、周期性脈沖以及各種不規(guī)則波形的電壓傳感器,也是我們國內的 湖南銀河電氣 自主研發(fā)的高精度電壓傳感器,可完全替代瑞士的LEM,精度高
    的頭像 發(fā)表于 02-20 09:43 ?518次閱讀
    淺談<b class='flag-5'>VS</b>系列電壓傳感器

    模數轉換器ADI AD7606與SC1467的深度對比和應用分析

    模數轉換器ADI AD7606與SC1467的深度對比和應用分析
    的頭像 發(fā)表于 01-13 09:52 ?949次閱讀
    模數轉換器ADI AD7606與SC1467的<b class='flag-5'>深度</b><b class='flag-5'>對比</b>和應用分析

    MediaTek與知名游戲引擎開發(fā)商Cocos達成深度合作

    為帶給開發(fā)者和用戶智能互動新體驗, MediaTek 與知名游戲引擎開發(fā)商 Cocos 達成深度合作,將 MediaTek 端側生成式 AI 領域的前沿技術,與 Cocos 在游戲開發(fā)領域的深厚積累相結合,通過為開發(fā)者提供更高效、更智能的開發(fā)工具和解決方案,共同推進端側生
    的頭像 發(fā)表于 01-10 13:48 ?423次閱讀

    容器引擎是什么意思

    容器引擎是一種虛擬化技術,它利用操作系統的內核來實現對應用程序的隔離和打包,使得應用程序可以在不同的環(huán)境中運行而無需修改代碼。主機推薦小編為您整理發(fā)布容器引擎是什么意思,以下是關于容器引擎的詳細解釋。
    的頭像 發(fā)表于 01-09 09:49 ?406次閱讀

    中科創(chuàng)達與火山引擎達成深度合作

    近日,中科創(chuàng)達與火山引擎在成都盛美利亞酒店隆重舉行深度合作簽署儀式?;鹕?b class='flag-5'>引擎汽車行業(yè)總經理楊立偉、中科創(chuàng)達執(zhí)行總裁常衡生見證簽約,火山引擎汽車出行戰(zhàn)略客戶總經理梁民忞、中科創(chuàng)達副總裁兼
    的頭像 發(fā)表于 11-04 14:34 ?690次閱讀

    VS高精度電壓傳感器

    ? ? ? ? VS系列電壓傳感器是一種量程覆蓋35kV及以下的直流、交流、周期性脈沖以及各種不規(guī)則波形的電壓傳感器,精度高達0.05%FS、帶寬高達100kHz,可滿足寬頻帶、高精度電壓測試需求
    的頭像 發(fā)表于 09-19 15:55 ?871次閱讀
    <b class='flag-5'>VS</b>高精度電壓傳感器