我是阿里巴巴做规则引擎相关工作多年的java工程师一枚,本职工作就是通过规则引擎、规则管理平台等技术输出,来应对阿里巴巴复杂多变的上层规则相关业务的支持。
限于技术保密、安全等因素,本文只讲一些个人对“规则引擎”的看法,欢迎大家一起探讨。
总体来说,要搞清楚“规则引擎”,需要很好的回答以下几个问题。
1、“规则引擎”的实际用途和价值
2、“规则引擎”的一般实现方式
3、“规则引擎”发展的一些坎坷
一、“规则引擎”的实际用途和价值
规则引擎和流程引擎一起,是使用在大规模复杂业务场景下必备的业务框架技术,使用这两门技术搭建起来的系统能够很好的梳理清楚业务逻辑,并且方便快速的修改业务逻辑,甚至可以做到需求的实时生效。
1、案例分析:
hard code的代价非常大,随着业务的膨胀会使开发人员和规则需求方非常的疲惫。
然而,“规则引擎”技术的运用会使整个业务发生很大变化。
从上面的案例可以看出,规则引擎最大的价值就在于通过以下的三个过程,大大的缓解了频繁的需求变化给整个业务系统带来的灾难。
- a、逼迫系统开发人员和业务专家梳理业务,定义统一的BOM(业务对象模型)。
- b、业务专家可以快速的制定修改规则,然后交由规则引擎自动化地来处理分析。
- c、规则引擎代替系统开发人员,解决由规则条件关联动作变化带来的开发工作。
二、“规则引擎”的一般实现方式
一套规则引擎总体就是要做到以下的目标:
建立规则语言标准,动态编辑,自动化执行。
很多业务系统一般会使用某种脚本语言来实现,比如groovy,jruby,javascript,原因很简单单,因为脚本语言本质上可以解决变量识别和自动运行的问题,而且扩展性强,表达能力强,动态部署生效。
另外,其他比如决策表等类似excel的输入,form表单的配置化 也可以转化为脚本语言。
三、“规则引擎”发展的一些坎坷
1、规则管理的复杂性:
a、优先级问题:比如你买了50块钱的东西,有满30减10,满50减20,系统会优先使用哪个规则呢?
b、冲突问题:假设有10条相关的法律规定,伤害致人死亡,会有可能判死刑。然后《未成年人保护法》规定,未满18周岁,不能判处死刑。这种情况下,系统对未成年人的杀人罪该如何判定呢?
c、规则列表的选择问题:很多时候,这可能只是个规则管理的业务模型问题,但是如何设计出一套足够应对所有的业务场景的模型还是非常难的。
2、面向运营人员的规则的页面配置化
a、通过一套通用的form表单来配置规则,产生规则脚本。
最佳的实践可能是采用 表单--------->json,xml格式化数据--------->规则脚本,这样可以很好的分离配置界面和脚本的强耦合关系,方便以后的维护。
3、规则运行效率的问题
如果你google下“规则引擎”,一般会有关于JSR94 和rete算法的介绍。
https://www.ibm.com/developerworks/cn/java/j-java-rules/
本质上,“专家决策系统规则引擎模型”和rate算法,解决的是大量重复的condition匹配效率的问题,以及规则冲突规范的问题,和脚本的性能比较不在同一个层面上。
具体,大家可以看看开源规则引擎:drools的实现方式。
当然,实际业务场景并不一定适合这套比价重量级的规则模型,会遇到学习成本高,灵活性差,rate算法不能发挥优势反而初始化成本很高的问题。
以上是个人结合工作实践,将一些个人对“规则引擎”的看法。
本人在阿里巴巴长期担任和负责规则引擎、流程引擎相关的技术开发,并且这方面也相当的缺乏人才。
这个是我们底层脚本引擎的开源项目:
https://github.com/alibaba/QLExpress
欢迎对这方面感兴趣的人联系我哦。
微信: 371754252
email: tianqiao@taobao.com
原文第一版发表于知乎专栏
https://zhuanlan.zhihu.com/p/28487660