说一个自己比较喜欢的开源产品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的更多相关文章

  1. 开源业务规则引擎JBoss Drools

    Drools 是什么? 规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策.接受数据输入,解释业务规则,并根据业务规 ...

  2. jboss规则引擎KIE Drools 6.3.0 Final 教程(1)

    前言 目前世面上中文的KIE DROOLS Workbench(JBOSS BRMS)的教程几乎没有,有的也只有灵灵碎碎的使用机器来翻译的(翻的不知所云)或者是基于老版本的JBOSS Guvnor即5 ...

  3. Drools 6.5 Final 入门

    Drools 6.5 Final学习笔记 最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Droo ...

  4. Linux服务器Jboss运行环境搭建步骤和开机自动启动脚本编写运行

    Jboss运行环境:Linux+Jdk+Jboss+jsp系统 Jboss软件说明:类似于Tomcat,就是一个跑Jsp系统的环境,他的站点路径跟Tomcat类似,Tomcat存放站点文件到webap ...

  5. 规则引擎 drools

    https://www.jianshu.com/p/725811f420db 深入了解Drools 简单介绍 笔者正在做风控系统,风控系统里边存在非常多的规则(比如:age < 16 || ag ...

  6. 几种常见web 容器比较 (tomcat、 jboss 、resin、 weblogic、 websphere、 glassfish)(转)

    点击打开PDF下载链接 web 容器比较 tomcat jboss resin weblogic websphere glassfish 1. Tomcat是Apache鼎力支持的Java Web应用 ...

  7. STS安装Drools

    download drools (including "Drools Engine" & "Drools and jBPM tools") from o ...

  8. Drools的Eclipse_IDEA插件安装

    1.说明 Drools使用时不是必须依赖插件的, 只是在安装了相应的插件之后, 在开发工具中能识别到对应的drools文件, 能够进行一些智能提示. 以及使用插件提供的便捷功能. 2.Eclipse插 ...

  9. drools中的条件 when

    目录 1.介绍 2.语法结构 3.模式例子 3.1 单个对象匹配 3.2 匹配任何对象 3.3 带条件匹配 3.3.1 注意事项 3.4 嵌套属性的匹配 3.4.1 访问单个嵌套属性 3.4.2 访问 ...

随机推荐

  1. django模型中的抽象类(abstract)

    首先介绍下django的模型有哪些属性:先看例子: Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.以下对此作一总结: abstract 这个属性是定义当前的模 ...

  2. 【首先膜拜大湿】poj-2386-Lake Counting-DFS模板题

    Lake Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16802   Accepted: 8523 De ...

  3. vim 添加到右键 windows

    >>>> 在windows下 <<<< ++ 在鼠标右键显示“用vim编辑”++ 1.删掉注册表中的HKEY_CLASSES_ROOT\*\shelle ...

  4. 《OD学hadoop》第一周0625 LINUX作业一:Linux系统基本命令(一)

    1. 1) vim /etc/udev/rules.d/-persistent-net.rules vi /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE= ...

  5. jsonp从服务器读取数据并且予以显示

    之前看了许多的关于jsonp的文章,大多是讲的比较的模糊的,下面是我的个人的理解! 基于这样的一段代码,做下解释: 这是在jsonp中读取数据的时候(取出来当然是json的格式json格式不清楚的,可 ...

  6. OpenStack介绍

    简介 OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作.OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单.可大规模扩展.丰富.标准统一的云计算管 ...

  7. 函数ut_malloc_low

    /**********************************************************************//** Allocates memory. @retur ...

  8. core—线程与IO

    CPU执行线程期间,从内存里调用指令,然后运行,这些指令有可能要从硬盘里面,网络里,读取数据.我们知道在计算机硬件体系中,从内存读取数据的速度会大于从硬盘或网络里面的速度.线程必须要等到硬盘里面的数据 ...

  9. UVa 10020 (最小区间覆盖) Minimal coverage

    题意: 数轴上有n个闭区间[ai, bi],选择尽量少的区间覆盖一条指定线段[0, m] 算法: [start, end]为已经覆盖到的区间 这是一道贪心 把各个区间先按照左端点从小到大排序,更新st ...

  10. 51nod1244 莫比乌斯函数之和

    推公式.f[n]=1-∑f[n/i](i=2...n).然后递归+记忆化搜索.yyl说这叫杜教筛?时间复杂度貌似是O(n 2/3)的? #include<cstdio> #include& ...