【Drools+springboot3规则匹配】
文章目录
- 一、 业务场景概述
- 二、整体技术架构
- 三、Drools概述
- 1. Drools 简介
- 2. Drools Rete 算法与flink-cep的区别?
- 2.1 Rete 算法概述
- 2.2 Flink CEP 概述
- 四、代码实现
- 4.1 导入依赖
- 4.2 从kafka消费数据
- 4.3 核心类,触发匹配操作并将匹配数据写入mysql
- 4.4 Drools 管理
- 4.5 相关的实体类
- 4.6 具体的规则
- 五、drools和flink 性能瓶颈对比
一、 业务场景概述
目前我的应用场景主要是从kafka获取低并发量的流式数据,通过drools进行多种规则匹配,规则存在外部数据库mysql会被其他业务系统频繁更新,我通过drools匹配到的结果则需要回写到mysql。大体的数据流转就是这样。
二、整体技术架构
数据源:kafka-3.5流式数据
规则数据存储:mysql-8
规则检测:Drools-8.41.0.Final
开发框架:springboot3+mybatis-Plus
三、Drools概述
1. Drools 简介
Drools 是由 Red Hat 主导的 Java 规则引擎框架,基于 Rete 算法,提供强大的规则匹配能力。官方开发文档地址:https://docs.drools.org/8.44.0.Final/drools-docs/drools/introduction/index.html
核心组件包括:
- 规则文件(.drl)
- KIE(Knowledge Is Everything)
- 容器和会话 Working Memory(事实对象)
- Agenda(匹配的规则)
2. Drools Rete 算法与flink-cep的区别?
2.1 Rete 算法概述
Rete(发音类似 /ˈriːtiː/) 是一种高效的规则匹配算法,广泛用于 规则引擎(如 Drools、CLIPS)。
📌 核心特点
基于事实匹配:将事实(Fact)放入工作内存,规则引擎根据条件表达式判断规则是否满足。
节点网络(Rete网络):构建类似数据流图的结构,用于缓存中间匹配结果,提高性能。
适用于静态事实池:比较适合“当前有一堆状态或事实,我要看看哪些规则满足”。
🧩 举例:
drl
rule "VIP Customer"
when$c: Customer(type == "VIP", amount > 1000)
then$c.setDiscount(0.2);
end
当一个 Customer 对象被插入到工作内存中,Drools 会用 Rete 算法查找所有匹配该对象的规则。
2.2 Flink CEP 概述
Flink CEP 是 Apache Flink 提供的 复杂事件处理(CEP)库,用于实时流数据中的事件序列检测。
📌 核心特点
基于事件序列匹配:关注事件的顺序和时间,比如 A 事件发生后 10 秒内是否发生 B。
流式处理:天然支持大数据流的高吞吐处理。
模式定义清晰:可以定义“开始事件”、“中间事件”、“结束事件”等。
适合时间驱动/实时场景:适合日志分析、风控告警等场景。
对比项 | Rete(Drools) | Flink CEP |
---|---|---|
应用场景 | 规则引擎,状态决策 | 流处理,时间敏感的事件模式识别 |
核心对象 | Fact(事实),规则 | Event(事件),Pattern(模式) |
匹配方式 | 基于属性条件的匹配 | 基于事件顺序、时间窗口的模式匹配 |
状态类型 | 静态内存(Working Memory) | 实时流状态(KeyedState + 时间) |
引擎原理 | Rete 网络优化条件查询 | NFA(非确定有限状态机)模式匹配 |
事件顺序支持 | 支持较弱(依赖额外规则定义) | 天生支持(next/within/before等) |
时间窗口支持 | 较弱(可通过规则实现) | 强(内建支持事件时间、乱序容忍) |
性能优化点 | 规则缓存、中间节点复用(Rete网络) | 流水线、状态 TTL、Watermark 等 |
四、代码实现
4.1 导入依赖
<properties><java.version>21</java.version><httpcomponents.version>4.5.14</httpcomponents.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.24</version></dependency><!-- drools依赖 --><dependency><groupId>org.drools</groupId><artifactId>drools-engine-classic</artifactId><version>8.41.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-engine</artifactId><version>8.41.0.Final</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-api</artifactId><version>8.41.0.Final</version></dependency><dependency><groupId>org.kie</groupId><artifactId>kie-internal</artifactId><version>8.41.0.Final</version></dependency><dependency><groupId>org.drools</groupId><artifactId>drools-drl-extensions</artifactId><version>8.41.0.Final</version></dependency><!-- Kafka -->