使用 QLExpress 構建靈活可擴展的業務規則引擎

目錄

一、什么是 QLExpress?

二、推薦系統中的規則腳本應用

1 場景描述

2 推薦規則腳本(QLExpress)

3 系統實現

4 執行結果

5 推薦系統應用建議

三、風控系統中的規則判定

1 場景描述

2 風控規則腳本(QLExpress)

3 系統實現

4 執行結果

5 風控系統應用建議

四、設計建議


在大型系統中,規則引擎的存在使業務邏輯從代碼中解耦出來,使得系統具備更高的靈活性與可維護性。阿里巴巴開源的 QLExpress 正是一款輕量級、高性能、可擴展的 Java 表達式引擎,廣泛應用于推薦、風控、營銷等場景。

本文將圍繞兩個典型業務場景:推薦系統風控系統,詳細演示如何使用 QLExpress 構建腳本型規則體系,實現“可配置、可執行、可熱更新”的規則邏輯管理。

一、什么是 QLExpress?

QLExpress 是阿里巴巴開源的規則引擎工具,核心目標是通過類 Java 的腳本語法實現業務規則的動態編寫與執行,具備如下特性:

特性說明
輕量高性能不依賴字節碼增強或復雜 AST,內存占用小、性能優越
表達式能力強支持 if, for, while, return 等控制結構
支持變量注入可注入上下文對象、Java Bean、自定義函數
可運行時加載可從數據庫或配置中心動態加載腳本規則
安全可控可配置沙箱環境,限制訪問對象與方法

二、推薦系統中的規則腳本應用

1 場景描述

推薦系統通常需要基于用戶畫像、行為等動態特征生成推薦策略。以如下規則為例:

  • 新用戶 + 喜好“運動” → 推薦“運動入門課程”

  • 活躍度高 → 推薦“高階訓練計劃”

  • 年齡小于 18 → 推薦“青少年專屬內容”

這些規則變化頻繁、迭代快速,采用腳本型規則管理更合適。

2 推薦規則腳本(QLExpress)

if (isNewUser && tags.contains("運動")) {return "推薦:運動入門課程";
} else if (activityScore > 80) {return "推薦:高階訓練計劃";
} else if (age < 18) {return "推薦:青少年專屬內容";
} else {return "推薦:通用內容";
}

3 系統實現

import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
import java.util.Arrays;
import java.util.List;
?
public class RecommendDemo {public static void main(String[] args) throws Exception {// 模擬用戶畫像UserProfile user = new UserProfile(17, Arrays.asList("運動", "學習"), 60, true);
?// 上下文注入DefaultContext<String, Object> context = new DefaultContext<>();context.put("age", user.age);context.put("tags", user.tags);context.put("activityScore", user.activityScore);context.put("isNewUser", user.isNewUser);
?// 推薦規則腳本String script = ""+ "if (isNewUser && tags.contains(\"運動\")) {\n"+ "  return \"推薦:運動入門課程\";\n"+ "} else if (activityScore > 80) {\n"+ "  return \"推薦:高階訓練計劃\";\n"+ "} else if (age < 18) {\n"+ "  return \"推薦:青少年專屬內容\";\n"+ "} else {\n"+ "  return \"推薦:通用內容\";\n"+ "}";
?Object result = new ExpressRunner().execute(script, context, null, true, false);System.out.println("推薦結果:" + result);}
?static class UserProfile {int age;List<String> tags;int activityScore;boolean isNewUser;UserProfile(int age, List<String> tags, int activityScore, boolean isNewUser) {this.age = age;this.tags = tags;this.activityScore = activityScore;this.isNewUser = isNewUser;}}
}

4 執行結果

推薦結果:推薦:運動入門課程

5 推薦系統應用建議

  • 后臺配置推薦規則腳本,實時熱更新;

  • 按用戶群體拆分規則(新用戶/老用戶);

  • 日志記錄命中規則,便于推薦效果分析。

三、風控系統中的規則判定

1 場景描述

風控系統中,我們需要實時評估用戶風險。例如:

  • 模擬器登錄 → 拒絕

  • IP 與登錄 IP 不一致 → 復審

  • 短時間內頻繁申請 → 復審

  • 行為評分過低 → 拒絕

2 風控規則腳本(QLExpress)

if (deviceType == "模擬器") {return "REJECT:模擬器登錄";
} else if (ip != loginIp) {return "REVIEW:IP地址異常";
} else if (applyCount > 5) {return "REVIEW:申請過于頻繁";
} else if (behaviorScore < 60) {return "REJECT:行為評分過低";
} else {return "PASS";
}

3 系統實現

import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
?
public class RiskControlDemo {public static void main(String[] args) throws Exception {RiskContext user = new RiskContext("模擬器", "192.168.1.10", "192.168.1.10", 2, 85);
?DefaultContext<String, Object> context = new DefaultContext<>();context.put("deviceType", user.deviceType);context.put("ip", user.ip);context.put("loginIp", user.loginIp);context.put("applyCount", user.applyCount);context.put("behaviorScore", user.behaviorScore);
?String script = ""+ "if (deviceType == \"模擬器\") {\n"+ " ?  return \"REJECT:模擬器登錄\";\n"+ "} else if (ip != loginIp) {\n"+ " ?  return \"REVIEW:IP地址異常\";\n"+ "} else if (applyCount > 5) {\n"+ " ?  return \"REVIEW:申請過于頻繁\";\n"+ "} else if (behaviorScore < 60) {\n"+ " ?  return \"REJECT:行為評分過低\";\n"+ "} else {\n"+ " ?  return \"PASS\";\n"+ "}";
?Object result = new ExpressRunner().execute(script, context, null, true, false);System.out.println("風控結果:" + result);}
?static class RiskContext {String deviceType, ip, loginIp;int applyCount, behaviorScore;RiskContext(String deviceType, String ip, String loginIp, int applyCount, int behaviorScore) {this.deviceType = deviceType;this.ip = ip;this.loginIp = loginIp;this.applyCount = applyCount;this.behaviorScore = behaviorScore;}}
}

4 執行結果

風控結果:REJECT:模擬器登錄

5 風控系統應用建議

  • 分維度組織規則(設備/IP/行為等);

  • 返回結果分類(REJECT/REVIEW/PASS)做后續分流;

  • 記錄執行日志與規則命中路徑;

  • 配合數據庫存儲規則并熱加載。

四、設計建議

QLExpress 提供了一種 靈活、輕量、高性能 的方式來處理復雜的業務規則:

  • 推薦系統中:策略運營人員可通過腳本靈活配置推薦邏輯;

  • 風控系統中:安全/風控策略團隊可動態調整風險判斷規則;

  • 實現代碼與規則解耦,提升系統響應與變更效率;

  • 可通過規則腳本 + 數據注入快速構建業務中臺能力。

如果你正在構建一個需要規則動態變更、邏輯可配置的系統,那么 QLExpress 會是非常值得引入的工具。


參考資料:https://github.com/alibaba/QLExpress

github:https://github.com/alibaba/QLExpress

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90230.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-13,(知識點:DC-DC電源,相位裕度,增益裕度)

目錄 1、題目 2、解答 相位裕度 增益裕度 3、相關知識點 一、波特圖 二、相位裕度 三、增益裕度 四、在 DC - DC 電源中的應用 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持續更新學習&#xff0c;加油&#xff01;&#xff01;&a…

學生信息管理系統 - HTML實現增刪改查

學生信息管理系統 - HTML實現增刪改查 效果圖 代碼 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><titl…

Agile簡介

Agile&#xff08;敏捷&#xff09;是一種軟件開發方法論&#xff0c;核心是通過快速迭代、靈活響應變化&#xff0c;解決傳統軟件開發中周期長、需求變更困難等問題&#xff0c;最終高效交付符合用戶實際需求的產品。 一、Agile 的起源&#xff1a;為什么需要敏捷&#xff1f;…

關于 URL 中 “+“ 號變成空格的問題

當你在 URL 中傳遞參數時&#xff0c;加號 () 會被自動轉換為空格&#xff0c;這是 URL 編碼的標準行為。問題原因在 URL 中&#xff1a;空格會被編碼為 號當 URL 被解碼時&#xff0c; 號又會被轉換回空格這會導致原始數據中的 號丟失解決方案你需要對參數值進行正確的 URL …

綜合實驗(2)

文章目錄 目錄 文章目錄 前言 OSPF運行在GRE隧道概述 典型應用場景 OSPF over GRE 配置 總結 前言 OSPF運行在GRE隧道概述 GRE&#xff08;Generic Routing Encapsulation&#xff09;隧道是一種通過封裝原始數據包在IP網絡中創建虛擬點對點連接的隧道技術。OSPF&#xff08;…

【應急響應工具教程】司稽(Whoamifuck):純Shell打造的Linux應急響應利器

1、工具簡介司稽&#xff08;Whoamifuck或Chief-Inspector,簡稱"who"&#xff09;&#xff0c;永恒之鋒發布的第一款開源工具&#xff0c;這是一款由shell編寫的Linux應急響應腳本&#xff0c;能對基本的檢查項進行輸出和分析&#xff0c;并支持一些擴展的特色功能。…

新手操作steam搬磚項目,應該如何快速起步

大家好哦&#xff0c;我是阿陽&#xff0c;今天繼續給大家分享一些steam搬磚的知識。在我們操作過程中&#xff0c;問題問得最多的就是&#xff0c;新手應該怎么做&#xff1f;首先&#xff0c;那我們得先來了解-下,什么是steam搬磚,它的項目原理是什么&#xff0c;其次針對于這…

rt-thread加一個庫

背景 官方軟件包里沒有的 可以以庫或組件形式加入 本次僅為了驗證&#xff0c;加到庫 過程 下載源碼 假設為 lib_demo 自己的板子目錄為bsp/stm32 代碼目錄結構 bsp/stm32librarieslib_demo //新建文件夾src //把lib_demo里源碼文件放進來inc //把lib_demo里頭文件放進來SConsc…

c++深拷貝和淺拷貝

一、淺拷貝本質&#xff1a;簡單地復制對象的成員值。如果成員里有指針&#xff0c;新對象和原對象的指針會指向同一塊內存。比如你有對象 A&#xff0c;里面指針 p 指向堆內存 0x123&#xff1b;用 A 拷貝出對象 B&#xff0c;B 的指針 p 也指向 0x123。問題&#xff1a;若其中…

NineData新增SQL Server到MySQL復制鏈路,高效助力異構數據庫遷移

在實際的數據庫遷移工作中&#xff0c;異構庫之間的遷移常常被視為一項“高風險、高工作量、高復雜度”的挑戰任務。這不僅是一次數據庫切換&#xff0c;更是對系統穩定性、數據一致性、業務連續性和技術團隊耐力的全方位考驗。為解決企業在異構數據庫遷移中的痛點&#xff0c;…

字符串和對象的深拷貝和淺拷貝

字符串和對象的深拷貝和淺拷貝【一】基本介紹【1】淺拷貝【2】深拷貝【二】字符串的拷貝【1】字符串的 “淺拷貝”【2】字符串的 “深拷貝”【三】對象的拷貝【1】淺拷貝&#xff08;Shallow Copy&#xff09;【2】深拷貝&#xff08;Deep Copy&#xff09;【四】字符串和對象拷…

4.5 優化器中常見的梯度下降算法

梯度下降算法&#xff08;Gradient Descent&#xff09;的數學公式可以通過以下步驟嚴格表達&#xff1a;1. 基本梯度下降&#xff08;Batch Gradient Descent&#xff09; 目標&#xff1a;最小化損失函數L(θ)\mathcal{L}(\theta)L(θ)&#xff0c;其中 θ\thetaθ是模型參數…

AM1.5G AAA穩態太陽光模擬器特點

光譜匹配度AM1.5G AAA穩態太陽光模擬器的光譜分布嚴格匹配國際標準IEC 60904-9中的AM1.5G光譜&#xff08;波長范圍300-4000nm&#xff09;&#xff0c;確保與自然太陽光的偏差在25%以內&#xff08;AAA級標準&#xff09;。光譜匹配度通過精密濾光片和氙燈或LED組合光源實現&a…

OSPF開放式最短路徑優先

1OSPF簡介&#xff08;1&#xff09;OSPF英文全稱Open Shortest Path First (開放式最短路徑優先)&#xff08;2&#xff09;OSPF是IETF 開發的一種鏈路狀態路由協議&#xff0c;使用基于帶寬的度量值。&#xff08;3&#xff09;OSPF采用SPF算法計算路由&#xff0c;從算法上保…

Lua(模塊與包)

Lua 模塊的基本概念Lua 中的模塊是一個由函數、變量組成的代碼庫&#xff0c;通常保存在獨立的 .lua 文件中。模塊通過 return 語句導出其內容&#xff0c;供其他腳本調用。模塊化設計可以提高代碼復用性&#xff0c;便于管理。創建模塊模塊通常以 .lua 文件形式存在&#xff0…

1. boost::asio之socket的創建和連接

網絡編程基本流程 網絡編程的基本流程對于服務端是這樣的 服務端 1&#xff09;socket——創建socket對象。 2&#xff09;bind——綁定本機ipport。 3&#xff09;listen——監聽來電&#xff0c;若在監聽到來電&#xff0c;則建立起連接。 4&#xff09;accept——再創建一個…

WPF 控制動畫開關

記錄一種實現方式&#xff1a;第一步&#xff1a;首先定義一個靜態類&#xff0c;提供依賴屬性&#xff0c;進而方便在xaml中實現綁定&#xff1a;public static class AnimationBehavior{// 定義附加屬性public static readonly DependencyProperty IsAnimatingProperty Depen…

元素豎向的百分比設定是相對于父容器的高度嗎?

元素豎向的百分比設定是相對于父容器的高度嗎&#xff1f; 核心問題 在CSS中&#xff0c;當設置元素的豎向屬性&#xff08;如height、padding-top等&#xff09;為百分比值時&#xff0c;其計算基準是父容器的高度還是寬度&#xff1f; 權威結論height屬性 百分比值基于父容器…

web3.0怎么入局

Web3.0(第三代互聯網)融合了區塊鏈、去中心化應用(DApps)、NFT、DAO等新興技術,給個人和機構提供了許多全新的賺錢機會。入局 Web3.0 賺錢主要有以下幾種途徑,根據你的技術背景、資金能力和時間投入可以選擇適合自己的方式。 目錄 一、普通用戶賺錢方式(門檻低) 1. …

linux入門 相關linux系統操作命令(二)--文件管理系統 ubuntu22.04

以下有免費的4090云主機提供ubuntu22.04系統的其他入門實踐操作 地址&#xff1a;星宇科技 | GPU服務器 高性能云主機 云服務器-登錄 相關兌換碼星宇社區---4090算力卡免費體驗、共享開發社區-CSDN博客 兌換碼要是過期了&#xff0c;可以私信我獲取最新兌換碼&#xff01;&a…