了解JBoss Drools Engine
说一个自己比较喜欢的开源产品JBoss Drools, 很多企业内部大型项目都在使用的规则引擎
该怎么理解规则引擎,到底是个什么东西,我好像没听过,我们能用么。
它是配有内置算法及对应数据结构的计算容器,在容器内部可以写我们的业务规则或计算规则。这套算法在规则引擎内的规则数爆增的情况下,可保计算速率不会有明显影响。 光是这点,就足够有吸引力。自己纯写代码不能避免这个问题。举个例子,比如有一个场景根据受保人的信息及车况信息来计算他下一年要交多少车险。略想一下,这个问题很简单么,就是建一个Java Pojo Bean Customer类,然后去针对这个Customer类的各个属性值在哪个区间内给出对应的车险金额。那我们可以这样写:
if((customer.getAge>24||customer.age<40)and (customer.getLoyaltyLevel()==Rang.GOLD) and (customer.getCarAge()<5) and customer.getCarCrashed()==0)
{
payment = 2000;
}
else if(...)
else if(...)
else if(...)
...
else
{
}
好,当我们写了十几、二十个的else if,这条业务才写完,然后也没错,我们意大利式面条的代码就出现了,看着有木有好揪心,有密集恐惧症的童鞋就碰也不想碰这套业务了。
那这种写法的大O记号为O(n),但如果这些业务规则写在规则引擎内,它的大O记号一定是O(1)<x<O(n),而且很有可能无限趋近于O(1),这是因为Drools engine的ReteOO+Phreak算法,可以做Node Index, Node Sharing, 对某些运算符优化,消除无用的部分匹配等等。这就是为什么规则数爆增的情况下,计算速率不会有明显影响。有兴趣可以去看看这两个算法。
那更多的业务情况不会有这么简单,更多的是几套子业务规则拼成一个完整的业务,一般情况是,先从前面的子业务规则做收纳,把可能有效的信息放在一个集合内。那在后面的业务规则再去把这个集合内的对象遍历一遍做减法,该修改的修改,该移除移除的。然后得出一个最优解。那代码就变成if()else if()...else() + for(if()else if()...else())...,好吧,这又是一份意大利面。说好编程是门艺术呢?怎么编程变成意大利面烹饪技???
Drools的规则语法是声明式的,不是解释式的。只要把每个业务规则写进去,把要计算的对象放进Working Memory中,规则引擎自己帮咱们算,我们不需要写if else,不需要写for或while。因为Drools的Working memory中的每个对象会被自动的去匹配所有的规则,它内部的事情就交给Drools的算法吧。我们只要告诉它有什么样的业务规则就好。Just care what to do, don't worry how to do.
有一次在我把基于Drool写出来的项目给一客户看,他面露喜色,这东西很巧嘛。 嘿嘿,灵巧之处还不仅仅在于此。
它能线上修改业务规则,不需要启停服务。在Drools中,业务规则没有放在Java代码内,是以单独的文件形式存放,比如drl(其实是txt)、csv、excel。业务与代码,业务与数据分离了。只要咱们的Model没变,只变业务规则,我们就不用修改代码,比方说,正好感上公司十周年庆,全场5折,仅限本周。这个需求一下来,我们就得开始去屡我们的意大利面,然后找到修改的地方,改完以后发QA测,产品人员验收,打包上线。 然而在Drools中,负责产品的人员就可以直接做了,不需要开发人员及QA的介入。有时候产品和开发、QA得解释半天要上线的规则,开发和QA才能听明白。这一套流程下来,一两天去了。如果产品自己做,几分钟或半小时就能搞定。 在互联网+的今天,时间就是市场。
有些人可能觉得这是不是有点夸张,其实真的可以,我们只需要为产品做一个规则管理的Web系统,这套管理系统能检索到所有的规则,并能增删改查及仿真。只有产品不要求开发改数据模型,就真心没开发QA什么事了。有人说,如果我把规则直接放数据库就好了,为什么还要用Drools?很好,但是您要加的规则不是模板化的怎么办?如果是多个对象协同计算怎么办?您是不是要去修改表结构?您也别忽略了Drools 算法的可优化性及潜力。
说了Drools这么多好处,它的缺点也不能不谈,它既然内置了一套算法和数据结构,说明它就是有开销的。它能把Java代码以外的规则文件并入到JVM内一起协作,也是有开销的。但是这些开销是只是业务规则小,计算量小的时候才能体现出来是个问题,如果业务规则复杂和计算量大可以靠它的算法去优化,它的价值就体现出来了。而且这些开销仅仅是在规则加载的时候比较明显。 要不说架构是演变出来的,从来就没有一颗银弹。但是在内存这么便宜的今天,Drools这么点开销真算不上什么 。
所以不是所有的应用都适合用它,如果只有一个或几个简单的规则还是不要用了,为了几个简单的业务去学习一个新产品,不值当。它适合比较复杂的业务及业务规则需要实时修改的,它能帮上很多忙。
这里只讲了Drools Engine的粗枝大叶,Drools 还有其它的组件,下次再聊。
了解JBoss Drools Engine的更多相关文章
- 开源业务规则引擎JBoss Drools
Drools 是什么? 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规 ...
- jboss规则引擎KIE Drools 6.3.0 Final 教程(1)
前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5 ...
- Drools 6.5 Final 入门
Drools 6.5 Final学习笔记 最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Droo ...
- Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行
Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...
- 规则引擎 drools
https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...
- 几种常见web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)(转)
点击打开PDF下载链接 web 容器比较 tomcat jboss resin weblogic websphere glassfish 1. Tomcat是Apache鼎力支持的Java Web应用 ...
- STS安装Drools
download drools (including "Drools Engine" & "Drools and jBPM tools") from o ...
- Drools的Eclipse_IDEA插件安装
1.说明 Drools使用时不是必须依赖插件的, 只是在安装了相应的插件之后, 在开发工具中能识别到对应的drools文件, 能够进行一些智能提示. 以及使用插件提供的便捷功能. 2.Eclipse插 ...
- drools中的条件 when
目录 1.介绍 2.语法结构 3.模式例子 3.1 单个对象匹配 3.2 匹配任何对象 3.3 带条件匹配 3.3.1 注意事项 3.4 嵌套属性的匹配 3.4.1 访问单个嵌套属性 3.4.2 访问 ...
随机推荐
- dojo 四 类的构造函数和父方法的调用
与java类一样,在Dojo里也可以定义constructor 构造函数,在创建一个实例时可以对需要的属性进行初始化.//定义一个类Mqsy_yj var Mqsy_YJ = declare(null ...
- 串口log
使用windows自带的超级终端: 可从开机log开始保存: -----
- 15.导入网表及status介绍[原创]
一.导入网表 在导入网表之前你的封装需确认是在你的封装路径下 建立Board工程后: ① ② ③ ④放置器件 ⑤ (切记,封装路径一定要添加) 二.status介绍 --- (常用) -------- ...
- Oracle Order Management DropShip Flow for R12
Oracle Order Management DropShip Flow for R12 Email ThisBlogThis!Share to TwitterShare to FacebookSh ...
- leetcode Database3(Nth Highest Salary<—>Consecutive Numbers<—>Department Highest Salary)
一.Nth Highest Salary Write a SQL query to get the nth highest salary from the Employee table. +----+ ...
- 4612 warm up tarjan+bfs求树的直径(重边的强连通通分量)忘了写了,今天总结想起来了。
问加一条边,最少可以剩下几个桥. 先双连通分量缩点,形成一颗树,然后求树的直径,就是减少的桥. 本题要处理重边的情况. 如果本来就两条重边,不能算是桥. 还会爆栈,只能C++交,手动加栈了 别人都是用 ...
- HDU 1372 Knight Moves【BFS】
题意:给出8*8的棋盘,给出起点和终点,问最少走几步到达终点. 因为骑士的走法和马的走法是一样的,走日字形(四个象限的横竖的日字形) 另外字母转换成坐标的时候仔细一点(因为这个WA了两次---@_@) ...
- ASP.NET路由系统实现原理:HttpHandler的动态映射
我们知道一个请求最终通过一个具体的HttpHandler进行处理,而我们熟悉的用于表示一个Web页面的Page对象就是一个HttpHandler,被用于处理基于某个.aspx文件的请求.我们可以通过H ...
- 今天发现猎豹浏览器的一个大坑 Request.IsAuthenticated 一直为 false;另外附加原因以及临时的解决方法
今天掉到了一个大坑里面,爬了1个多小时才发现不是代码的问题,居然是浏览器的问题… 下面是问题的发生过程 单点登陆 有2个站点 http://a.abc.com http://b.abc.com ...
- volley(4) 请求参数:data:[ { bar_remain:XX , bar_code:"XX" , bar_id: XX}], method:GET
1. 来自于WHCombineBatchFragment.java 2.部分代码 ).).).).port + Url.LABELPRINT + "?data="+strPrint ...