这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
规则引擎设计与实现
规则引擎初认识
定义:
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,使用预定义的语义模块编写业务决策
优点:
解决开发人员重复编码的问题
业务与服务解耦,提升服务的可维护性
缩短开发路径,提高效率
减少了硬编码业务规则的成本和风险
组成:
数据输入、规则理解、规则执行
应用场景:
风险对抗(比如对抗薅羊毛的黑灰产业)、活动策略运营、数据分析和清洗
规则引擎编译原理
词法分析:
源代码字符串转换为词法单元(将句子转变成词组)
方法:有限自动机(状态数有限,每个输入都有一个确定的状态转换)
语法分析:
识别表达式的语法结构(识别词组在句子中的类型或作用)并构建抽象语法树并检查
抽象语法树
上下文无关语法,语句无需考虑上下文就可以判断正确性,可以使用巴科斯范式(BNF)表达
递归下降算法,自顶向下构造语法树,不断对token进行语法展开
类型检查
类型综合:根据子表达式类型构造夫表达式类型
发生时期:编译时检查(构造语法树时)、运行时检查
规则引擎设计
设计目标:支持特定词法、运算符、数据类型和优先级、支持预定义语法的规则表达式的编译和执行
常见规则引擎
Drools:基于 Java 语言开发的开源规则引擎可以将复杂且多变的业务规则从硬编码中解放出来,以规则脚本的形式存放在文件或特定的存储介质中(例如存放在数据库中) ,使得业务规则的变更不需要修改项目代码、不用重启服务器就可以在线上环境立即生效,使用最为活跃、广泛并且开源。
Easy Rules:EasyRule 是轻量级的规则引擎 API。它提供 Rule 抽象来创建带有条件和动作的规则,以及 RulesEngine 通过一组规则运行以测试条件和执行动作的 API。通过注解、链式编程、表达式、yml 文件 等方式灵活选择使用