什么是规则引擎
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎能做什么
降低复杂业务逻辑组件复杂性、降低应用程序的维护和可扩展成本。
常见应用场景
1.风控配置
2.用户积分
3.离线计算
4.商品等级
应用规则引擎带来哪些好处
1.逻辑和数据隔离
2.可扩展性高
3.可维护性高
4.知识集中化
5.提高业务灵活性
6.业务透明度增强
7.减少系统频繁迭代升级风险
8.简化系统架构
核心组件
Fact
事实对象,对于真实事物或者事实的承载对象,例如:登录事实对象,可能包含:登录ip,用户id,登录设备,近一一小时内登录成功次数,近一小时登录失败次数,可以理解为规则引擎所需要的输入参数。规则引擎会基于Fact对象和规则,构造DAG。
Rule
规则,由条件构成和结论构成的推理语句。例如:if ... then ... else .....,if 登录ip in 黑产ip列表内,then 命中登录黑名单 else 放行。这里的规则通指,if..then...else...的原子规则,而非多条件多关系的规则集。
LHS
规则的左半部分,通常指规则的if.... 部分。进一步细化,一般是指,具体的左半边因子,操作符,右半边因子。例如:if 登录ip in 黑产ip列表内。左半边因子即登录ip,操作符即in,右半边因子即黑产ip列表。
RHS
规则的右半部分,通常指规则的then以及else部分。一般是指具体的action,因为then以及else,往往是对应具体的动作,例如:或者给其他参数赋值(赋值动作),执行其他的函数(执行方法动作)。
知识包,知识包是打包了,某一个业务场景下,所有的规则,所有的库文件(Fact元数据描述库,动作库,常量库,枚举库),甚至包括评分卡,决策流等。一个知识包往往是一个业务场景下大的集合,知识包都有版本概念,可以发布新版本的知识包,当有新的知识包发布,所有依赖某个业务规则的客户端,都会更新为最新知识包下的规则。
Session
kiesession代表一次回话,一个回话往往对应一个工作区,即包括整体流程的执行。
Workmemory
工作区,即执行规则的内存空间,一个workmemory对应一次回话,对应一次规则的执行。
Rete
由LHS部分构成的规则网络,通常是DAG图。
Rete算法_yin__ren的博客-CSDN博客_rete算法
漫话规则引擎(2): 模式匹配算法 - 心内求法 - 博客园
Agenda
议程,决定执行哪些RHS的Action。
Action
动作,RHS部分对应的具体动作,例如:赋值,打印参数,执行方法等。
技术选型
名称 | 场景 | 核心技术 | 优点 | 缺点 | 应用案例 | 难度 |
Drools | 1、业务代码和业务规则分离 2、适用于大型应用系统 | 模式匹配:Rate OO 算法 1、将初始数据(fact)输入Working Memory。 2、使用Pattern Matcher比较规则(rule)和数据(fact)。 3、如果执行规则存在冲突(conflict),即同时激活了多个规则,将冲突的规则放入冲突集合。 4、解决冲突,将激活的规则按顺序放入Agenda。 5、使用规则引擎执行Agenda中的规则。重复步骤2至5,直到执行完毕所有Agenda中的规则。 | 1、功能完善 2、具有监控 3、操作平台等功能 4、支持DMN 5、文档完善 | 1、学习成本高 2、比较重,复杂度高 3、独立系统很难进行二次开发 4、以内存实现时间窗功能,无法支持较长跨度的时间窗 5、不二次开发很难融入京东技术生态 | 携程 | 🌟🌟🌟🌟🌟 |
EasyRules | 1、业务代码和业务规则分离 2、适用于大型应用系统 | 表达式语言(MVEL/SpEL) 1、使用MVEL表达式模式开发时,可以直接编写java代码直接编译执行,更好的支持扩展 2、使用SpEL,模式时可以进行yml文件编写,更好支持脚本模式开发,yml格式文件更加易读 | 1、 轻量 2、 易学 3、支持复合规则 4、定义规则方式多样 5、支持复杂业务场景 6、可集成至京东技术生态 | 1、不支持DMN 2、活跃度较低 3、文档较少 | Apache Nifi | 🌟🌟🌟 |
Aviator | 1、各种表达式的动态求值 | Aviator会将表达是编程字节码,交给JVM去执行。 AviatorEvaluator(执行器)支持两种模式进行表达式执行: 1、以执行速度优先: AviatorEvaluator.setOptimize(AviatorEvaluator.EVAL); 2、编译速度优先,这样不会做编译优化: AviatorEvaluator.setOptimize(AviatorEvaluator.COMPILE); AviatorEvaluator在执行表达式执行结果,可以进行对表达式缓存,使用了LRU算法,进行缓存淘汰。 | 1、轻量级 2、高性能 3、文档完善 4、社区活跃 5、可扩展 6、易学 7、可集成至京东技术生态 | 1、不支持DMN 2、支持业务场景较简单 | 美团酒旅实时数据规则引擎 | 🌟🌟 |
URule | 1、业务代码和业务规则分离 2、适用于大型应用系统 | 1、应用Rete算法做为核心算法,生成可视化Rete树,规则文件校验,模型版本控制 2、使用JSR 170进行规则内容存储管理 | 1、功能完善 2、支持规则集,决策树,决策表 3、文档完备(有视频教程) 4、易集成 5、易改造 | 1、社区不活跃 2、应用案例较少 3、源码应用技术栈相对落后 | 中小公司 | 🌟🌟🌟 |
最终选择 考虑对接系统:微应用制作,仓配相关业务系统等,大多应用场景为:页面组件校验规则,计算规则,频繁变更因子表示,多数属于表达式规则,故选择更加轻量级,高效的表达式引擎,Aviator。
微应用规则引擎
架构设计
规则依赖流程