规则引擎
开发规则平台的意义:
- 低代码的,可视化的规则配置平台
- 快速集成:在依赖其它系统接口的时候,不再需要额外工作量,只需要注册接口,即可完成集成
- 在保证运行结果正确的情况下,优化数据结构,减少内存开销,提升运行速度
试用链接:数据每天24点会重置 https://www.pincheche.online/rule-front/
更多开源软件 https://www.pincheche.online/
概念
基础概念
- 固定值:包括NUMBER, STRING, COLLECTION, BOOLEAN, JSONOBJECT,用户可以直接输入格式相对应的常量
- 元素:即参数,用户调用规则需要传入的参数(不是必须的),后面会详细解释
- 变量:
a. 主要功能为绑定函数进行计算,绑定的函数赋予了变量的功能;
b. 拥有参数,在计算过程中参数会转换为绑定的函数所需要的参数
c. 参数可以由变量,元素,固定值,(用户也可以继承Value类进行扩展)等组成 - 函数:包括用户自己开发的内部函数;也可以通过注册接口成为函数,接口将通过http的请求进行调用
- 条件:由左值 ,运算符号,右值组成,左值和右值可以是固定值,元素,变量
- 条件组:条件的集合,条件之间为&&关系
- 条件集:条件组的集合,条件组之间为 || 关系
- 规则:由条件和动作组成,条件计算结果为true,则返回动作的运算结果
a. 条件可以是单个条件,条件组,条件集等
b. 动作可以是固定值,元素,变量等 - 规则集:由多个规则组成,根据策略可以选择,
a. 按顺序运行规则,触发一个规则即返回
b. 按顺序运行所有规则,返回所有触发规则 的执行结果的集合
c. 随机运行所有规则,触发一个规则即返回 - 决策树:主要用来解决具有大量重复条件的规则集,会构建为一棵决策树,达到节省内存,提升运行速度,可以用表格进行编辑,支持让用户一键导入,
特点
- 节省内存:通过树的数据结果 和享元模式的设计,达到节省内存的目的
- 提升运行速度:根据权重优化执行顺序,达到fast-fail,从而提升速度
- 快速接入其它系统 :可以直接注册接口封装为函数,0成本接入其它系统,不需要迁入其它系统的代码
设计
规则引擎主要包含3种类型的规则及一个函数容器
支持的计算符号
左值类型 | 运算符 | 中文解释 | 右值类型 |
---|---|---|---|
String 字符串 | = | 等于 | String 字符串 |
!= | 不等于 | ||
indexOf | A包含子串B | ||
notIndexOf | A不包含子串B | ||
startWith | A以B开头 | ||
notStartWith | A不以B开头 | ||
endWith | A以B结尾 | ||
notEndWith | A不以B结尾 | ||
in | A串在B集合中 | 集合 | |
Number 数值类型 | = | 等于 | Number 数值类型 |
!= | 不等于 | ||
> | 大于 | ||
>= | 大于等于 | ||
< | 小于 | ||
<= | 小于等于 | ||
in | A串在B集合中 | 集合 | |
Boolean 布尔类型 | = | 等于 | Boolean 布尔类型 |
!= | 不等于 | ||
in | A串在B集合中 | 集合 | |
Collection 集合 | contain | A集合包含B | 字符串 |
数值 | |||
布尔 | |||
集合 | |||
notContain | A集合不包含B | 字符串 | |
数值 | |||
布尔 | |||
集合 | |||
= | A集合等于B集合 | 集合 | |
in | A集合是B集合的子集 | 集合 |
规则:
主要包含条件及结果,条件可以是单个条件,条件组,或条件集,加载规则时,在不改变执行结果的情况下,默认会根据条件的权重进行优化排序,以提高执行效率,条件==true, 则返回结果
####执行过程
规则集:
规则的集合,加载规则集时,在不改变执行结果的情况下,默认会根据规则的权重进行优化排序,以提高执行效率,根据选择的执行策略,返回相对应的结果
决策表
可以理解为一种特别的规则集,其中的规则都拥有相似的条件,加载决策表时,会构建决策树以节省内存,运行期间根据策略运行不同的算法,以提高执行效率
建树过程:
1.逐行处理每一条规则,因为每条规则包含的条件列、结果列数量是一定的。因此当第一行数据插入后,树的层数已经确定。
2.每插入一条新的规则,匹配已有节点:a.没有匹配则新增节点
b.当到达叶子节点(结果节点),将结果作为叶子节点的属性。若有节点,将结果合并,反之新增。
c.对于空条件,创建“恒成立“节点
d.对于区间类条件,建树成本较高,例如条件1:值 > x,则需要遍历同一层所有>x的值节点,并且在多个条件节点后加入相同。(注:由于将成本开销控制在引擎建树阶段,依然可以保持引擎运行态的高效性。)执行过程:
对于决策树而言,存在单一匹配和完全匹配两种策略, 有着不同的执行过程。以单一匹配策略为例, 运行过程如下所示: 单一匹配策略:
a. 从决策树的根节点进入,顺序遍历所有子节点,如果任意一节点的条件为true,则进行如下判断:
b. 该节点是否是具有结果属性的叶子节点?如果是,返回叶子节点的结果集中的第一个结果。
c. 如果该节点是叶子节点,但不具有结果属性,则返回空。
d. 如果该节点不是叶子节点,递归向下进行遍历,寻找具有结果属性的叶子节点,直到找到最后一层的节点为止。
如果所有条件都不成立,则返回空。全匹配策略:
执行过程与单一匹配类似,在 b 过程中,使用回溯+备忘录获取所有结果