当前位置: 首页 > news >正文

【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 -->

相关文章:

  • 利用 DeepSeek-R1 模型和计算机视觉微调模型实现马铃薯叶片疾病识别和分类
  • STM32使用rand()生成随机数并显示波形
  • 如何在PDF.js中改造viewer.html以实现PDF的动态加载
  • 优化WAV音频文件
  • hooker frida版just_trust_me.js 2025升级 支持boringssl unpinning
  • Skipped breakpoint at ... because of stepping in another thread问题分析
  • AI Agents系列之构建多智能体系统
  • linux驱动之poll
  • Kaggle-Bag of Words Meets Bags of Popcorn-(二分类+NLP+Bert模型)
  • Redis ③-Linux下载Redis
  • 【医学影像 AI】早产儿视网膜病变国际分类(第三版)
  • python中,处理多分类时,模型之间的参数设置
  • 《计算机视觉度量:从特征描述到深度学习》—工业检测大模型RAG白皮书
  • 星露谷物语 7000+ 大型MOD整合包
  • 18-算法打卡-哈希表-两数之和-leetcode(1)-第十八天
  • 从零开始学A2A一:A2A 协议的高级应用与优化
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(7):(1)ながら 一边。。一边 (2)。。。し。。。し。。 又……又……
  • SuperMap iClient3D for WebGL 如何加载WMTS服务
  • 天梯赛DFS合集
  • 网上图书销售系统 UML 状态图解析:触发器事件、动作与监视条件
  • 解除近70家煤电厂有毒物质排放限制,特朗普能重振煤炭吗?
  • 由“环滁皆山”到“环滁皆景”,滁州如何勾勒“文旅复兴”
  • 观察|美军在菲律宾部署新导弹,试图继续构建“导弹链”
  • 用户称被冒用身份证异地办卡申请注销遭拒,澎湃介入后邯郸联通着手办理剥离
  • 同比增长4.2%!一季度全国财政支出持续增长
  • 雅生活服务:向雅居乐收购两家环保公司,总价约6060万元