文章目錄
- 一、 業務場景概述
- 二、整體技術架構
- 三、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 -->