Lightest rule service based on Nested Set Model
NSMRule,nested set model,基于嵌套集合模型的规则引擎实现方案
规则引擎的核心是将复杂易变的业务逻辑从应用代码中剥离出来,使业务规则的定义和运行隔离开来,这样当业务需求改变时,只需要更改规则定义,而不需要修改代码,以及重新编译、部署整个项目,提高了应用的扩展性和可维护性。
由事实对象、规则核心和结果对象三部分构成,结构示意图如下:
用户输入的事实对象,作为决策因子使用。
由语义存储模块和规则匹配模块构成的。
处理业务方配置的规则转换成可以存储的格式并持久化。同分支规则是OR的关系,不同分支规则是AND的关系:
if [(A∧B)∨(C∧D)]∧F then O
[(A∧B)∨(C∧D)]∧F=(A∧B∧F)V(C∧D∧F): (O1=O2)
[(A∨B)∧(C∨D)]∨F then O
[(A∨B)∧(C∨D)]∨F=(A∨B∨F)∧(C∨D∨F):
根据外部传入的事实对象和存储的规则计算得到最终的结果对象。采用树形结构构建规则树,规则配置灵活,支持AND、OR任意组合,同分支规则是OR的关系,不同分支规则是AND的关系:
画外音
默认支持十种规则运算:
运算符 | 说明 | 支持类型 |
---|---|---|
eq | 等于 | 数值型/字符型 |
neq | 不等于 | |
gt | 大于 | 数值型 |
egt | 大于等于 | |
lt | 小于 | |
elt | 小于等于 | |
btw | 属于 | |
nbtw | 不属于 | |
in | 包含于 | 字符型 |
nin | 不包含于 |
成功匹配和失败匹配的平均匹配效率均小于O(n)
规则处理完毕后的结果。
输入
{
"a":9,
"b":1,
"order":11
}
输出
{
"hitList": [//命中列表
{
"name": "result_name1",
"val": "result1",
"ruleList": [//命中的规则,b在区间[1,9]内,且a大于8
{
"name": "b",
"val": "[1,9]",
"op": "btw"
},
{
"name": "a",
"val": "8",
"op": "gt"
}
]
},
{
"name": "\b能力1",
"val": "普通单",
"ruleList": [//命中的规则,a在大于2,且order大于10
{
"name": "a",
"val": "2",
"op": "gt"
},
{
"name": "order",
"val": "10",
"op": "gt"
}
]
}
],
"missList": [//不命中列表
{
"name": "reward1",
"val": "{\"bonus\":6000,\"type\":1}",
"ruleList": [//没命中的规则,lowestOrderNum不在区[8,100]内
{
"name": "lowestOrderNum",
"val": "[8,100]",
"op": "btw"
}
]
}
]
}
利用逻辑运算规则可以简化设计,简化逻辑表达式