最近两个月以来,一直在开发公司的规则引擎系统,起初是想把引擎用到CRM系统中,后来经过多次讨论、多次变更,领导决定把这个规则引擎做成中间件,在平台的高度来使用他。做成中间件,对规则引擎的要求更高了,这需要引擎具备高灵活性和伸缩性,来适应不同的业务系统。下面我来谈谈开发过程中我的一些经验。
曾经听板桥先生说过,架构设计需要从事物外部(通过与其他同类事物比较)和深入事物内部两种方式来进行,实际就是“做什么”和“怎么做”分离。首先,我需要技术选型,在众多的规则引擎中,适合java项目的有ILog、Jess、Mandarax、Drools,由于ILog和Jess不是开源的,所以这两个提前出局。剩下Mandarax和Drools,这两个开源项目各有千秋,但是我比较了一下,Mandarax最近几年都没有过更新,并且文档不全、社区不活跃,而Droos在google一搜,有很多的mail list供我参考,所以我很倾向于使用Drools。在一篇Mandarax的入门文档的评论里,我看到一个朋友在业务的角度来比较他们俩,看完后,我更加确定Drools是最适合我的。
接下来,我开始了解需求,初步规划规则引擎,在了解完各个系统的业务需求后,我大致定了下规则引擎要做的事情以及引擎与其他系统的边界。由于各个系统之间差异比较大,要让引擎高可扩展,需要对需求进一步抽象,业务系统与规则引擎之间是通过模型来交互的,所以我们单独将模型抽象出来,在引擎中可以对模型进行管理。另外一个需要抽象的地方就是规则的动作部分,由于每个系统数据库、业务的差异性,动作是不可能统一的,将动作抽象为动作类型,并可以单独管理,当有新系统接入引擎时,我们为其定义新的动作类型即可。
引擎有了初步规划后,我开始了解Drools,结合Drools的特点进一步规划引擎。Drools的官方文档上提供了很详细的例子来供我们入门,这里不再赘述入门级别的代码。我需要列举一下自己的引擎中需要实现的功能并在Drools中找到解决方案:
1.规则有效期
Drools中的date-effective和date-expires生来就是干这个的。
2.基于Cron的定时任务
Drools中的timer可以实现,并且官方例子很详细。
3.规则返回结果
Drools中的globle很适合。
4.规则优先级
可以使用salience来解决。
5.计算类的属性
对于一些需要预处理的属性,我们可以不定义字段,而是直接定义一个无参数的方法,具体可以参考这篇文章的4.8.3.1.1.1节。
6.规则的与或关系
这是Drools天生就支持的,并且是完美支持。
掌握了基本的技术点后,我开始设计规则的创建页面,整个规则引擎大致的思路是:把前端用户输入的语言(通俗易懂的白话语言)作为输入,经过一系列处理转换后,保存到数据库(我们特殊处理的语言)。在规则执行的时候,我们再从数据库拿出保存在数据库的“语言”,然后转换为Drools语言。只所以不把前端用户的输入直接转换为Drools语言,是因为我们的场景、属性、动作类型都是可以灵活变动的,如果创建之初就进行转换,会导致之后的扩展异常困难。
规则的创建页面包含规则的名称、有效期、条件信息和动作信息等,条件部分我们允许用户选择实体(模型)属性并可以对属性做四则运算或者与或关系,这样在保证引擎的强大之时却不失简单之美。为了保证条件的正确性,系统需要在保存规则之前对用户输入的条件进行正确性检验。动作的创建首先是需要选择动作类型,然后根据定义好的动作类型去输入相应的内容,这块还涉及到一些其他知识,比如静态变量和动态变量,这里不再展开细说。
说到页面了,那就接着来,由于是后台的管理界面,所以我毫不犹豫的选择了DWZ。选择DWZ有这几个考虑:一是我对他熟悉,上手快。二是他的速度还可以,并且对常用的浏览器都有较好的支持。关于DWZ的一些使用经验我都零零碎碎分享到了博客里,供以后参考。
上面说了,引擎的核心工作其实就是转换。我们需要把自己的语言转换为Drools语言,这里面就涉及到很多字符串的拼装,接下来我谈谈这部分工作的经验:
1.使用StringBuffer进行拼装,并且注意对拼装规则进行格式化(比如在每行后面换行,这样方便我们调试与排错)。
2.巧用正则表达式,比如我们要得到两个@之间的字符串,可以使用下面的代码:
1
Matcher m=Pattern.compile("\\#(.*?)\\#").matcher(str);
2
List<String> list = new ArrayList<String>();
3
while(m.find()){
4
list.add(m.group(1));
5
}
3.以Drools规则语言的标准来组织程序,做到有条不紊。在代码关键部分多打log,方便调试。
完成引擎的解析工作后,剩下的部分就容易多了,无非是一些CRUD的工作,比如对场景的管理、场景中实体的管理、角色的管理等等。
引擎开发工作持续了将近一个月,接下来进入测试阶段。我们需要根据压测结果对引擎核心代码进行优化重构,这部分我主要借助VisualVM和JConsole,在压测的同时使用VisualVM进行CPU采样,然后进行分析。经过几轮的测试,我发现之前自己的代码中有很多的不严谨之处,比如:
1.使用StatefulKnowledgeSession后没有调用dispose方法去释放内存资源,这一错误会让引擎不停的内存溢出。
2.没有对KnowledgeBase进行缓存,而是对字符串进行缓存。由于没有对KnowledgeBase进行缓存,每次请求到来之时都需要重新编译规则,而规则编译的成本相当高,没有对代码修正之前,给引擎300左右的并发CPU负载就到了10,而修正后,300的并发CPU负载没有超过1。
3.没有关闭Reader流,这个就太粗心了,幸好及时发现。
再剩下就是一些其他方面的优化,比如tomcat、mysql等,和主题无关,我留在心里。
分享到:
相关推荐
总结以上知识点,规则引擎Ilog Jrules是一种企业级业务规则管理系统,它通过提供丰富的工具组件和强大的规则定义能力,帮助开发者实现业务规则的模块化管理与快速变更。安装和使用Ilog Jrules时,需要关注安装顺序、...
【Java规则引擎开发教程全】 Java规则引擎是一种用于在应用程序中动态执行业务规则的技术,它允许开发者将业务逻辑从核心代码中分离出来,方便管理和维护。Drools是一款基于Java的开源规则引擎,广泛用于构建复杂的...
总结来说,Drools规则引擎是一种强大的业务逻辑管理系统,它通过为业务规则提供灵活定义和运行时执行的能力,增强了业务逻辑的可维护性和可扩展性。熟练掌握Drools的开发和使用,需要对规则引擎的基本原理、Drools的...
- **商用规则引擎**:这类规则引擎通常由专业的软件公司开发并销售,提供全面的技术支持和维护服务。它们往往具有更高级的功能和更好的性能表现,但也伴随着较高的成本。 - **开源规则引擎**:开源规则引擎是由社区...
总结来说,"规则引擎eclipse插件"是一种能够帮助开发者在Eclipse环境中高效管理规则引擎的工具。它提供了友好的界面和强大的功能,使得业务规则的创建和维护变得更加便捷。通过理解插件的结构和依赖,以及遵循相应的...
总结来说,规则引擎是一种强大的工具,能够帮助开发者将复杂的业务逻辑转化为可管理和可扩展的规则集。Drools作为其中的一个优秀实现,提供了丰富的功能和优秀的社区支持,而“Drools4Demo”这个压缩包则可能为初学...
规则引擎技术作为一种灵活且高效的业务逻辑管理工具,在现代软件开发中扮演着至关重要的角色。尤其在Java社区,规则引擎的应用越来越广泛,它不仅能够帮助软件架构师更好地应对多变的业务需求,还能提高系统的可维护...
在本文的背景下,研究者可能需要利用源码管理工具(如Git),以及规则引擎相关的开发工具(如Drools的GUI工具)来编写、测试和演示规则引擎的应用。 6. 源码管理 源码管理是软件开发中不可或缺的一个环节,它帮助...
在IT领域,规则引擎是一种软件系统,用于处理和执行基于特定...在实际的业务环境中,规则引擎和规则流的运用可以极大地提高业务逻辑的可维护性和可扩展性,减少对应用程序源代码的改动,从而降低开发成本和维护难度。
### Drools5规则引擎开发教程知识点总结 #### 一、Drools5规则引擎简介 - **Drools5概述**:Drools是一个开源业务规则管理系统(BRM)和业务流程管理系统(BPM),广泛应用于Java应用程序中。Drools5是Drools系列中的...
### 搜索引擎系统学习与开发总结 #### 一、搜索引擎概述 **搜索引擎的发展历史** 互联网初期,信息资源有限,寻找所需资料相对简单。但随着互联网的快速发展,信息量激增,用户面临查找所需资料的巨大挑战。为了...
总结来说,Das Recht是一个用JavaScript编写的规则引擎,它为处理选择和权限规则提供了一种简洁的方法。对于需要动态决策和权限管理的项目,Das Recht可以是一个高效且易于使用的解决方案。开发者可以利用其灵活性和...
### 基于规则引擎的消息中心模块的设计与实现 #### 一、背景介绍与问题定义 随着信息技术的发展,物流行业面临着越来越复杂的业务处理需求。为了提高物流系统的灵活性和可扩展性,采用Web服务(Web Services)、...
总结来说,ILOG规则引擎通过XOM、BOM、规则应用工程和客户端工程构建了一个完整的规则管理框架,使业务规则的定义、维护和执行变得简单且高效。无论是技术团队还是业务团队,都能在这个框架下找到自己的角色,共同...
Python-Naga是一个基于Datalog的规则引擎,它在Python开发环境中提供了一种强大的逻辑编程工具。Datalog是一种声明性编程语言,它源自于Prolog,主要用于处理数据查询和推理问题。Naga允许开发者定义一系列规则,...