这是我参与「第五届青训营 」伴学笔记创作活动的第6天
前言
本节课介绍了规则引擎,中间穿插了一些编译原理。让我初步认识了规则引擎。
1.规则引擎
1.定义
规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
一般流程开发vs采用规则引擎开发
一般流程开发:一次性、开发人员负荷大
采用规则引擎开发:很多进行二次开发,开发人员只需要维护引擎,业务人员可以直接进行决策修改
2.优点
- 解决开发人员重复编码问题
- 业务决策与服务本身解耦,提高服务的可维护性
- 缩短开发路径,提高效率
3.组成部分
- 数据输入:支持接受使用预定义的语义编写的规则作为策略集;接受业务的数据作为执行过程中的参数。
- 规则理解:能够按照预先定义的词法、语法、优先级等正确理解业务规则所表达的语义。
- 规则执行:根据执行时输入的参数对策略集中的规则进行正确的解释和执行。同时对规则执行过程中的数据类型进行检查,确保执行结果正确。
4.应用场景
- 风控对抗:与黑灰产的对抗过程中,策略研发和产品需要能够根据黑灰产特征进行快速识别和对抗。规则引擎作为风控系统的核心,使产研人员能够不断的调整和优化对抗策略,以实现最好的风控识别效果。
- 活动策略运营:根据用户效果反馈进行运营策略的优化和调整;将服务代码与业务运营逻辑解耦,提高运营策略的迭代效率;方便新玩法的探索和效果验证
- 数据分析和清洗:对数据进行整理、清洗和转换。
2.编译原理
1.整体步骤
- 理解
- 词法分析
- 语法分析
- 执行
- 抽象语法树
- 输入输出
- 参数注入
- 类型检查
2.具体步骤
- 词法分析
把源代码字符串转换为词法单元(Token)的这个过程,采用有限自动机进行Token识别。简单来说就是分段。
ps:有限自动机就是一个状态机,它的状态数量是有限的。该状态机在任何一个状态,基于输入的字符,都能做一个确定的状态转换。具体如下:
- 语法分析
在词法分析的基础上,识别表达式的语法结构的过程。可使用巴科斯范式来表达。简单来说就是分类。
- 抽象语法树
表达式的语法结构可以用树来表示,其每个节点(子树)是一个语法单元,这个单元的构成规则就叫“语法”。每个节点还可以有下级节点。简单来说就是连接。
特点:上下文无关语法和递归下降算法。
其中,上下文无关语法无需考虑上下文就能判断正确性;递归下降算法是对Token进行语法展开,该过程中可能会遇到递归问题。
结构特点
- 一元运算符:左子树为空,右子树为右操作数
- 二元运算符:左子树为左操作数,右子树为右操作数
- 括号:左子树为空,右子树为内部表达式的AST
上述过程的结果实例为:
- 参数注入即用户输入参数
- 类型检查
主要在编译时检查和运行时检查。 编译时:需要提前声明参数的类型,在构建语法树过程中进行类型检查;执行时:可以根据执行时的参数输入的值类型,在执行过程中进行类型检查。
3.规则引擎设计
1.目标
支持特定的词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行。 其中,词法指符合规范的Token,比较具体;数据类型就是字符串、布尔值、int、float这样的大类。
2.流程
- 设计词法分析的状态机
其中,蓝色圆是最后的输出结果。最下面一行是逐步输入判断,毕竟两个输出之间操作有关系。
- 进行语法分析,根据巴科斯范式列出语法树
巴科斯范式如下:
- 执行语法树
对抽象语法树进行后续遍历执行,即:先执行左子树,得到左节点的值;再执行右子树,得到有节点的值;最后根据根节点的操作符执行得到根节点的值。
- 进行类型检查
方法:在一个节点的左右子节点执行完成后,分别校验左右子节点的类型是否符合对应操作符的类型检查预设规则。
例如:>符号要求左右子节点的值都存在且为 int或float;!符号要求左节点为空且右节点的值为 bool 等。
4.规则引擎实践
实操规则引擎——YoungEngine,之后会补充实操感受。
小结
本节课初步认识到规则引擎概念,其实感觉是设计一个系统,具体来说可以是一个生产机器。业务人员进行简单系统操作就可以生产产品,开发人员只需维护机器就可以,不像传统操作需要开发人员不断根据业务人员需求生产只符合单一项目的产品。规则引擎非常实用,之后会不断进行学习!
参考
- 字节跳动规则引擎设计与实现教程