这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
规则引擎
什么是规则引擎?
举个例子:
用户在商城购买商品可以获得积分奖励,对应有一个奖励规则,不同价格的商品有不同价格的积分。
如果规则简单,可以通过if...else来实现。再复杂一点的可以通过列表for循环来计算。
但是如果是更复杂的规则,包括价格,用户标签,商品属性来判断积分的话,就需要一个规则引擎来实现:
计算规则==>[规则引擎] <== 价格、标签等等
==>积分
输入计算规则,价格和标签等等,得到对应的积分数值。
规则引擎的定义: 是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块来编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
规则引擎将业务规则与程序代码解耦,使得业务人员可以不通过开发人员就实现对规则的修改。
规则引擎由哪些部分组成?
-
数据输入
-
预定义的语法规则编写的策略集
- 例如 "price > 500"
-
业务数据作为执行过程中的参数,例如价格,标签等
-
-
规则理解
- 按照预定义的语法语义等,正确理解业务规则所表达的含义
-
规则执行
- 根据输入的参数对规则进行解释和执行
- 执行时进行类型检查,确保结果的正确性
规则引擎的应用场景有哪些?
-
风控对抗
在对抗黑灰产时,风控系统的核心就是一个规则引擎,可以实时地根据黑灰产的特征快速识别和对抗。
-
活动策略运营
业务策略与代码解耦,可以快速地根据用户反馈对运营策略进行优化和调整
-
数据分析和清洗
使用规则引擎对数据进行整理、清洗和转换。
编译原理的基本概念
词法分析|语法分析|抽象语法树|类型检查
编译原理中的概念对应上述规则引擎的组成部分:
-
规则理解
- 词法分析,语法分析
-
规则执行
- 抽象语法树
-
输入输出
- 参数注入、类型检查
词法分析
把源代码中的字符串划分为Token的过程。
例如:
price > 500 && ( isNewUser || userLevel> 5)
price>500&&(isNewUser||userLevel>5)
通过有限状态机FSM(finate-state Automation)来识别Token。
语法分析
将词法分析划分好的Token列表转换成为 语法树的过程
price>500&&(isNewUser||userLevel>5)划分为 oprand1 op oprand2的语法树
上述表达式的根节点就是
&&
如何转换为语法树?
-
上下文无关文法
产生式: 一个表达式可以由另外一直类型的表达式或者符号推导产生
exp : add ; add : add '+' mul | mul; // a + b * c mul : mul '*' pri | pri; // a * b pri: string | bool | number | identifer;通过上述的BNF范式,定义了乘法与加法组成的表达式
-
递归下降算法
自顶向下构造语法树,不断对Tokens进行语法展开,展开过程中可能遇到递归。
类型检查
-
类型综合
根据子表达式的类型构造出父表达式的类型
-
编译时检查&运行时检查
如何设计一个规则引擎
设计目标
-
支持特定的词法、运算符、数据类型和优先级
- 词法(Token)
-
支持基于以上预定义语法规则的表达式的编译和执行
词法分析:
需要设计词法分析的状态机。
语法分析:
BNF范式定义来定义语法的规则
语法树执行与类型检查:
-
语法树执行:
预先定义好每种操作符的执行逻辑,对抽象语法树进行后序遍历执行
-
类型检查
执行时检查:在一个节点的左右子节点执行完成后,分别检查左右子节点的类型是否符合当前操作符的预设规则。