这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
今天课程的主要内容如下:
- 认识规则引擎
- 编译原理基本概念
- 设计一个规则引擎
- 规则引擎的实现
1、什么是规则引擎
当我们在对复杂的业务进行开发时,程序本身逻辑代码和业务代码互相嵌套、错综复杂,同时维护成本高,可拓展性差。
规则引擎是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来。通过使用预定义的语义模块来编写业务逻辑规则。在执行时接受数据输入、解释业务规则,并做出决策。规则引擎能大大提高系统的灵活性和扩展性。
在字节跳动,规则引擎已经在风控识别、活动运营、配置下发等场景得到了广泛的应用。开发人员可以将业务逻辑与服务代码解耦,实现灵活、高效的业务策略发布。目前公司内部基于规则引擎的动态决策系统已经承接了千万级别QPS的决策请求。
2、为什么要使用规则引擎
业务规则经常变化,系统需依据业务的变化,实现快速、低成本的迭代更新。
因此,为了快速、低成本的更新,我们需将逻辑代码和业务代码进行解耦:
- 研发人员(不需懂业务)开发维护程序部分,同时测试通过后,后续不会经常变化改动;
- 业务人员可直接管理这些业务规则,同时不需要研发人员的参与。
因此它具有以下优点:
- 简化系统架构,优化应用
- 提高系统的可维护性
- 减少编写“硬代码”业务规则的成本和风险
- 应付特殊状况,即客户一开始没有提到要将业务逻辑考虑在内
- 过将规则引擎分开,它提供了更大的可重用性。
3、规则引擎编译原理
3.1 理解
- 语法分析:把源代码字符串转换成词法单元的过程。
- 语法分析:在词法分析的基础上识别出表达式的语法结构。
3.2 执行
- 抽象语法树:表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树一定是唯一确定的。
3.3 输入输出
- 类型检查:验证执行的结果是否为合适的数据类型。在抽象语法树中,通常会验证某节点的子节点的数据类型是否合法。
- 参数注入:在规则执行的过程中,使用输入的参数值来计算语法树中的标识符节点值的过程。