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


規則的變更能否實時改變邏輯Drools熱刷新規則的方式現在看起來有點傻,它的規則是通過生成jar的方式 。然后系統遠程動態讀取jar包來完成規則刷新的 。
而且一定得通過workbench的方式進行規則的熱變更 。
LiteFlow在這個層面做的高級很多 。如果你是用Nacos,Etcd,zookeeper等方式存儲,不用做任何事 , 改變即自動刷新 。如果你是SQL數據庫存儲 , 或者本地存儲 。在改變規則之后 , 需要調用LiteFlow框架提供的一個API進行熱變更 。2種方式均可熱更新 。并且在高并發情況下是平滑的 。
結論
LiteFlow在熱更新設計層面比Drools先進很多 。
是否有界面形態來支持Drools有workbench,workbench是一個獨立的插件包,提供了web界面編寫規則以及fact對象 。并提供了檢查和部署的能力 。但因為Drools主要關心邏輯片段,并不需要提供編排層面的拖拽UI功能,只是提供了在界面上編寫規則的能力 。
LiteFlow并沒有界面形態 。目前只能通過第三方的Nacos , Etcd提供的界面來輔助完成界面的規則修改 。
結論
Drools在UI形態生態上領先LiteFlow一截 。
框架的性能表現這里用Drools和LiteFlow實現了同樣的一段邏輯Demo 。
根據訂單金額來加積分的Demo案例 。
案例邏輯很簡單,根據訂單的金額來動態判斷該加多少積分:
小于100元,不加積分 。
100到500元,加100積分 。
500到1000元,加500積分 。
1000元以上 , 加1000積分 。
其中Drools的規則如下:
package rules;import com.example.droolsdemo.entity.Order;rule "score_1"when    $order:Order(amount<100)then    $order.setScore(0);    System.out.println("觸發了規則1");endrule "score_2"when    $order:Order(amount>=100 && amount < 500)then    $order.setScore(100);    System.out.println("觸發了規則2");endrule "score_3"when    $order:Order(amount>=500 && amount < 1000)then    $order.setScore(500);    System.out.println("觸發了規則3");endrule "score_4"when    $order:Order(amount>=1000)then    $order.setScore(1000);    System.out.println("觸發了規則4");end其中等價的LiteFlow規則如下:
<?xml version="1.0" encoding="UTF-8"?><flow>    <nodes>        <node id="w" type="switch_script">            <![CDATA[                def amount = defaultContext.getData("order").getAmount();                if (amount < 100){                    return "a";                }else if(amount >= 100 && amount < 500){                    return "b";                }else if(amount >= 500 && amount < 1000){                    return "c";                }else{                    return "d";                }            ]]>        </node>        <node id="a" type="script">            <![CDATA[                def order = defaultContext.getData("order");                order.setScore(0);                println("執行規則a");            ]]>        </node>        <node id="b" type="script">            <![CDATA[                def order = defaultContext.getData("order");                order.setScore(100);                println("執行規則b");            ]]>        </node>        <node id="c" type="script">            <![CDATA[                def order = defaultContext.getData("order");                order.setScore(500);                println("執行規則c");            ]]>        </node>        <node id="d" type="script">            <![CDATA[                def order = defaultContext.getData("order");                order.setScore(1000);                println("執行規則d");            ]]>        </node>    </nodes>    <chain name="chain1">        SWITCH(w).TO(a, b, c, d);    </chain></flow>

推薦閱讀