【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.pswp.cn/pingmian/77249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77249.shtml
英文地址,請注明出處:http://en.pswp.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命…