规则引擎是什么
规则引擎是根据一些算法,执行固定规则的一系列软件系统。规则引擎整合了传入系统的Fact(现实对象)集合和规则集合,从而去触发一个或多个业务操作。规则通常以声明式的方式在业务代码中实现,我们可能以为它很少会被改变。但事实上,这些业务逻辑的判断条件经常会被改变。
简而言之就是一些软件系统,按照一些算法,执行默写郭泽,在某些条件下,执行某些任务。类似定时任务一样,在一个固定的时间,满足业务规则,执行代码块。
在拥有大量规则和Fact对象的业务系统中,可能会出现多个Fact输入都会导致同样的输出,这种情况我们通常称作规则冲突。规则引擎可以采用不同的冲突解决方案来确定冲突规则的执行顺序。在规则引擎中,通常有两种执行方式:
正向链接:这是一种基于“数据驱动”的形式,基于插入的Fact对象和Fact对象的更新,规则引擎利用可用的Fact推理规则来提取出更多的Fact对象,直到计算出最终目标,最终会有一个或多个规则被匹配,并计划执行。因此,规则引擎始于事实,始于结论。
反向链接:这是一种基于“目标驱动”或推理形式,与正向链接相反。反向链条从规则引擎假设的结论开始,如果不能够直接满足这些假设,则搜索可满足假设的子目标。规则引擎会循环执行这一过程,直到证明结论或没有更多可证明的子目标为止。
为什么不直接使用定时任务或者 if 判断进行各种使用呢。要用到规则引擎。其实规则与规程不同之处主要在于:业务流程,或者说流程处理;而规则引擎则代表了决定做什么业务。
为什么要有规则引擎,解决了什么问题
根据综上所述,可能还是不太能很好的理解什么是规则引擎。先阐述一下产品产生的背景。
在企业级项目的开发和管理中,系统肯定要面临各个版本的迭代与更新,可能有的更新小小一块儿,但是有的更新可能直接让系统直接面临整体重做,或者部分大型业务重做的问题。这不止增加了运维成本,还大大增加了各项投入,低产能,高投入。为了快速、低成本的更新,业务人员应该直接管理项目中的规则,不需要开发人员的加入。
而开发人员也遇到了问题:程序=算法+数据结构。中间离不开编码,而编码=先需求分析+程序设计+需求明确+流程疏导+测试。往往在测试的时候,编码还在变化,各种规则往往在系统的各种地方。从更新版本上来讲,对于程序开发人员本身来说已经是很困难的事了。更不要说一点代码不懂得业务人员或者是产品人员。
因此迫切需要分离商业决策者的商业决策逻辑和应用开发者的技术决策。把这些商业决策放在中心数据库或其他统一的地方,让它们能在运行时(即商务时间)可以动态地管理和修改从而提供软件系统的柔性和适应性。
规则引擎正是应用于上述动态环境中的一种解决方法。
总结:规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据规则做出业务决策。
工作原理就是:规则引擎可以在系统工作时,将外部的业务规则加载到系统中,并使得系统按照该业务规则进行工作
业务规则
一个业务规则包含一组条件和在此条件下执行的操作,它们表示业务规则应用程序的一段业务逻辑。业务规则通常应该由业务分析人员和策略管理者开发和修改,但有些复杂的业务规则也可以由技术人员使用面向对象的技术语言或脚本来定制。业务规则的理论基础是:设置一个或多个条件,当满足这些条件时会触发一个或多个操作。
规则引擎的功能
规则引擎是一个中间件,也是由程序开发人员实现的,所以也应有开发人员通过程序接口的方式来使用和控制。规则引擎主要包含的API有如下几种:
- 加载和卸载规则集的API。
- 数据操作的API。
- 引擎执行的API。
开发人员在程序中使用规则引擎基本遵循以下5个典型的步骤: - 创建规则引擎对象;
- 向引擎中加载规则集或更换规则集;
- 向引擎提交需要被规则集处理的数据对象集合;
- 命令引擎执行;
- 导出引擎执行结果,从引擎中撤出处理过的数据。
使用了规则引擎之后,许多涉及业务逻辑的程序代码基本被这五个典型步骤所取代。一个开放的业务规则引擎应该可以”嵌入”在应用程序的任何位置,不同位置的规则引擎可以使用不同的规则集,用于处理不同的数据对象。
此外,对使用引擎的数量没有限制。
规则引擎的推理步骤如下:
- 将初始数据(fact)输入至工作内存(Working Memory)。
- 使用Pattern Matcher将规则库(Rules repository)的规则(rule)和数据(fact)比较。
- 如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合。
- 解决冲突,将激活的规则按顺序放入Agenda。
- 执行Agenda中的规则。
- 重复步骤2至5,直到执行完毕Agenda中的所有规则。
java规则引擎的框架
Java规则引擎主要有JRules/Drools/JLisa/QuickRules/OpenRules/Corticon等。以上这几个是市面上比较主流的规则引擎。
Drools
Drools是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声明方式表达业务逻辑。可以使用非XML的本地语言编写规则,从而便于学习和理解。
并且,还可以将Java代码直接嵌入到规则文件中,这令Drools的学习更加吸引人。Drools有如下特点:
- 完整的实现了Rete算法;
- 提供了强大的Eclipse Plugin开发支持;
- 通过使用其中的DSL(Domain Specific Language),可以实现用自然语言方式来描述业务规则,使得业务分析人员也可以看懂业务规则代码;
- 提供了基于WEB的BRMS——Guvnor,Guvnor提供了规则管理的知识库,通过它可以实现规则的版本控制,及规则的在线修改与编译,使得开发人员和系统管理人员可以在线管理业务规则。