规则的变更能否实时改变逻辑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>
推荐阅读
- Mysql单表访问方法,索引合并,多表连接原理,基于规则的优化,子查询优化
- 真心话大冒险六条规则(真心话大冒险一至六规则图)
- tensorflow-gpu版本安装及深度神经网络训练与cpu版本对比
- MYSQL-->InnoDB引擎底层原理
- 麻将玩法说明(南城麻将玩法规则)
- 使用开源计算引擎提升Excel格式文件处理效率
- 会玩飞行棋怎么进房间(飞行棋的玩法和规则)
- JuiceFS 元数据引擎选型指南
- 实时营销引擎在vivo营销自动化中的实践 | 引擎篇04
- day09-1存储引擎