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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;几乎维系着整个安卓程序运行的生命周期&#xff0c;但是这么重要的一个东西&#xff0c;我们真的了解它吗&#xff1f;下面跟随着我的脚步&#xff0c;慢慢揭开Hanler的神秘面纱吧&#xff01; 本文将介绍Handler 的运…

读书笔记 -- MySQL架构

1、MySQL逻辑架构 最上层的服务并不是 MySQL所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。 第二层架构是 MySQL 比较有意思的部分。大多数 MySQL 的核心服务功能都在这一层包括查询解析、分析、…

linux 4.14内核jffs2文件系统不自动释放空间的bug

前段时间在做spi-nor flash项目的时候&#xff0c;使用jffs2文件系统&#xff0c;发现在4.14内核下存在无法释放空间的bug&#xff0c;后来进行了修复&#xff0c;修复后功能正常&#xff0c;现将修复patch公开&#xff0c;供后来者学习&#xff1a; diff --git a/fs/jffs2/ac…

vue3+vite 实现.env全局配置

首先创建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依赖&#xff1a; pnpm install dotenv --save-dev 引入完成后&#xff0c;在vite.config.js配置文件内加入以下内容&#xff1a; const env dotenv.config({ path: ./.env }).parsed define: { // 将…

Oracle 19c部署之手工建库(四)

#Oracle #19c #手工建库 手工创建Oracle数据库&#xff08;也称为手工建库&#xff09;是指在已经安装了Oracle数据库软件的基础上&#xff0c;通过手动执行一系列命令和步骤来创建一个新的数据库实例。这种方法与使用Database Configuration Assistant (DBCA)等工具自动创建数…

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷军一度登顶中国首富&#xff0c;太厉害了&#xff08;2025年03月02日&#xff09; 早盘&#xff0c;小米港股一路高歌猛进&#xff0c;暴涨4%&#xff0c;股价直接飙到52港元的历史新高。这一波猛如虎的操作&#xff0c;直接把雷军的身家拉到了2980亿元&#xff0c…

【Python爬虫基础篇】--1.基础概念

目录 1.爬虫--定义 2.爬虫--组成 3.爬虫--URL 1.爬虫--定义 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展&#xff0c;万维网成为大量信息的载体…

C语言超详细结构体知识

1.自定义类型&#xff1a;结构体的介绍 在之前的博客中&#xff0c;我们简单介绍过了关于结构体的基本知识&#xff0c;这里我们稍微复习一下。 结构体(struct)是C语言中一种重要的复合数据类型&#xff0c;它允许将不同类型的数据组合成一个整体。 1.1结构体的定义 结构体使…

C++学习:六个月从基础到就业——内存管理:new/delete操作符

C学习&#xff1a;六个月从基础到就业——内存管理&#xff1a;new/delete操作符 本文是我C学习之旅系列的第十七篇技术文章&#xff0c;也是第二阶段"C进阶特性"的第二篇&#xff0c;主要介绍C中动态内存管理的核心操作符——new和delete。查看完整系列目录了解更多…

15~30K,3年以上golang开发经验

继续分享最新的面经&#xff0c;前面发的两篇大家也可以看看&#xff1a; 「坐标上海&#xff0c;20K的面试强度」「北京七猫&#xff0c;薪资25~35K&#xff0c;瞧瞧面试强度」 今天分享的是golang开发岗面经&#xff0c;要求是3年以上golang开发经验&#xff0c;薪资为15~3…

Python爬虫实战:获取优志愿专业数据

一、引言 在信息爆炸的当下,数据成为推动各领域发展的关键因素。优志愿网站汇聚了丰富的专业数据,对于教育研究、职业规划等领域具有重要价值。然而,为保护自身数据和资源,许多网站设置了各类反爬机制。因此,如何高效、稳定地从优志愿网站获取计算机专业数据成为一个具有…

ArcPy工具箱制作(下)

在上一篇博客中&#xff0c;我们已经初步了解了如何制作ArcPy工具箱&#xff0c;包括工具箱的基本概念、准备工作、脚本编写以及将脚本转换为工具箱的步骤。今天&#xff0c;我们将继续深入探讨ArcPy工具箱的制作&#xff0c;重点介绍一些进阶技巧和优化方法. 一、优化工具箱的…

不一样的flag 1(迷宫题)

题目 做法 下载压缩包&#xff0c;解压&#xff0c;把解压后的文件拖进Exeinfo PE进行分析 32位&#xff0c;无壳 扔进IDA&#xff08;32位&#xff09;&#xff0c;找到main&#xff0c;F5反编译 没啥关键词&#xff0c;ShiftF12也找不到什么有用的点 从上往下分析吧 puts(…

工程化实践:Flutter项目结构与规范

工程化实践&#xff1a;Flutter项目结构与规范 在Flutter项目开发中&#xff0c;良好的工程化实践对于提高开发效率、保证代码质量和团队协作至关重要。本文将从项目结构、代码规范、CI/CD流程搭建以及包管理等方面&#xff0c;详细介绍Flutter项目的工程化最佳实践。 项目结…

[Java · 初窥门径] Java 语言初识

&#x1f31f; 想系统化学习 Java 编程&#xff1f;看看这个&#xff1a;[编程基础] Java 学习手册 0x01&#xff1a;Java 编程语言简介 Java 是一种高级计算机编程语言&#xff0c;它是由 Sun Microsystems 公司&#xff08;已被 Oracle 公司收购&#xff09;于 1995 年 5 …

1187. 【动态规划】竞赛总分

题目描述 学生在我们USACO的竞赛中的得分越多我们越高兴。我们试着设计我们的竞赛以便人们能尽可能的多得分。 现在要进行一次竞赛&#xff0c;总时间T固定&#xff0c;有若干类型可选择的题目&#xff0c;每种类型题目可选入的数量不限&#xff0c;每种类型题目有一个si(解答…

使用KeilAssistant代替keil的UI界面

目录 一、keil Assistant的优势和缺点 二、使用方法 &#xff08;1&#xff09;配置keil的路径 &#xff08;2&#xff09;导入并使用工程 &#xff08;3&#xff09;默认使用keil自带的ARM编译器而非GUN工具链 一、keil Assistant的优势和缺点 在日常学…

【React】通过 fetch 发起请求,设置 proxy 处理跨域

fetch 基本使用跨域处理 fetch 基本使用 在node使用原生ajax发请求&#xff1a;XMLHttpRequest()1.获取xhr对象 2.注册回调函数 3.设置参数&#xff0c;请求头 4.发起连接原生ajax没有带异步处理 promise&#xff1b;原生ajax封装一下&#xff0c;以便重复调用jQuery&#…

Redis(二) - Redis命令详解

文章目录 前言一、启动Redis并进入客户端1. 启动Redis2. 进入Redis客户端3. 使用IDEA连接Redis 二、查看命令帮助信息1. 查看所有命令2. 查看指定命令帮助 三、键操作命令1. set命令2. mset命令3. keys命令4. get命令5. mget命令6. dump命令7. exists命令8. type命令9. rename命…