规则引擎深度对比,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>

推荐阅读