记一次使用规则引擎改造任务系统的经验

QLExpress规则引擎实战 由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。 阅读详情

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

9a404bd206ffd46244d26f80174dfa7c.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7401403660246614070


前言

笔者在去年接手了公司的活动中台,其中【任务】,是活动当中必不可缺的玩法之一。

相信大家都在各种各样的互联网活动中体验过【任务】。

比如:

  • 打车软件去完成一笔订单可以给用户发一个奖品;

  • 如用户去申请白条的额度,就能给用户发放京豆;

从技术思维上,以上的流程,可以抽象成,用户完成某个动作,就给用户发放对应的奖品。

作为中台的任务系统,往往会对接上游N个业务方的不同任务,并且任务也会有不同的完成条件。

如:

电商业务:用户支付一笔3000元以上的订单,完成【订单任务】 商业化业务:用户完成一个app下载,且打开app浏览10秒,完成【app下载任务】 生活业务:用户完成一笔话费充值,且充值金额大于50元,完成【话费充值业务】

具体的流程图如下:

a145ffe4cdbe72e7512b6a84bd926617.jpeg

任务系统重构

可以看到,业务侧将消息通过RocketMQ的方式,通知至任务系统。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

痛点解决-如何避免对接新的任务,改造代码

以上方式,会有一个实实在在的痛点:每次任务完成条件发生变更,就需要任务系统更改代码,现状需要一周的时间去对接一个新的任务。

举个例子,假如电商业务中,【订单任务】的完成条件从【3000元以上订单】调整为【5000元以上订单】,任务系统每次还得去调整代码,以支持【5000元以上订单】完成的条件。这种如此慢的迭代方式,显然是不够支持业务的发展速度。

所以任务系统的行动点就是:任务完成条件变动,做成可配置化,支持运营在后台管理系统随时调整任务的配置条件。

统一消息格式

其实仔细分析,任务完全可以抽象成为:针对某个行为, 判断行为中的条件是否满足运营配置的要求

但是系统的现状为,各个业务的消息体虽都是json格式,但格式都不一致,任务系统写了很多针对不同消息格式的定制化代码适配,其流程图如下:

d63549066457c0a62ffdfece8a85e831.jpeg

统一消息格式的好处

因此我先要求业务方的mq格式消息体进行改造,按照任务系统的统一标准进行格式传递。

标准消息体格式如下
"userid": "",  
"business": "",
"behavior": "" ,     
"behaviorTime": "",
"extraData": {  
}

userId是用户的id,business是该事件所属业务,behaviorTime是行为发生的时间, behavior就是用户具体的任务行为,比如【完成订单叫pay_order_success】, app下载叫【app_download】, 话费充值叫【tel_recharge】。

最为关键的是extraData, 这个字段是拓展字段,主要用于存放每个行为的附加条件,比如:

【完成订单】,该字段可以存放订单交易金额,是否首次下单,那么完成订单的完整消息为:

"userid": "12345", 
"business": "onlineShop",
"behavior": "pay_order_success" ,     
"behaviorTime": "完成订单时间戳",
"extraData": {    
    "tradeTotalMoney": 500000, 
    "firstTime": true
}

以上完成消息对应的中文含义为:用户12345, 在某个时间,完成了【电商业务】中的【下单成功】行为,行为的附加属性为:【交易金额大于5000元,用户本次是首次交易】。

之后,所有对接任务系统的任务,业务方必须按照我的要求,来传递消息。

做好了任务消息的标准化,就开始下一步优化:如何将完成条件进行抽象,做成可配置化管理?

完成条件可配置化

想把任务完成的配置完全交给运营,首先需要有个类似下面这种配置的管理后台,为简单的画一下管理后台的原型。

63d4b0a413c7a0d3053d39a7c8cf6893.jpeg

任务系统重构-后台管理示意图

灵魂画家。。。总而言之,就是把任务的完成条件开放至运营,并支持可配。

根据我从业经验,这种规则支持配置的场景,便是【规则引擎】的最佳使用场景。结合项目组的现状,我决定使用阿里的QLExpress, 并进行重构。

QLEpress介绍如下:

https://github.com/alibaba/QLExpress  
由阿里的电商业务规则、表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制等强需求而设计的一门动态脚本引擎解析工具。  
在阿里集团有很强的影响力,同时为了自身不断优化、发扬开源贡献精神,于2012年开源

引入了规则引擎后,在判断任务完成的代码时候,其实就是对QlExpress的脚本进行判断,任务的完成条件可以表现为一串脚本命令,如:

tradeTotalMoney >= 300000 && firstTime = true

在执行完成任务代码的时候,任务系统会将【任务消息体】中的extraData,构造成一个HashMap, 传入到QLEpress的api中。

"userid": "12345", 
"business": "onlineShop",
"behavior": "pay_order_success" ,     
"behaviorTime": "完成订单时间戳",
"extraData": {    
    "tradeTotalMoney": 500000, 
    "firstTime": true
}

使用QLEpress的api,express就是【脚本命令】, context是一个Map,对于任务系统来说,就会把extraData传入函数中。

Object r = runner.execute(express, context, null, true, false);

对于QLEpress来说也很简单,就是做了Map对象中的key替换的动作,实际上就是执行以下的这段代码:

Object r = 500000  >= 300000 && true = true

其系统流程图如下:

bcf10d79b2b833d567a939f4c151f463.jpeg

任务系统重构-系统交互流程

假如运营现在想把任务系统中【完成订单】的完成条件中的订单交易金额5000改成3000,也很简单了,只需通过后台管理系统更改配置就能实现任务的调整。

后台系统新增条件的可配置化。

你以为以上就是最终方案了么,对接新的任务就不用开发了么?

其实不然,细心的读者会发现,后台系统如果要新增 【任务完成行为】 和【完成条件】,后台管理系统还是得开发代码。比如:需要新增一个【加入购物车】的任务,还是需要后台系统开发。

所以,我们的下一步优化策略,是将【任务完成行为】和 【完成条件】做成配置化,后台动态读取数据库的配置进行显示,其流程如下:

687ca7431413695bb02c3121f4aa0684.jpeg

任务系统重构-支持元数据配置

这里我把属于【规则引擎】的内容抽象成一个系统,让这个系统去对规则领域的内容进行管理。

其实12步,“引入【规则引擎系统提供的sdk】,执行规则引擎代码 ”,有两种方案,也可以由任务系统在交互的过程中,传入参数,去调用【规则引擎系统】提供的RPC接口,但考虑到增加了一层网络开销,且规则引擎执行的场景也相对简单,不会对规则引擎的代码进行过多调整,所以采取的是引入sdk的方式,通过本地代码执行去减少不必要的网络开销。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

结论

经过规则引擎的重构后,再对接新的任务,只需通过开发1分钟在后台配置元数据,即可完成新的任务对接,比起之前动辄一周的新任务对接,大大提高了效率。

笔者也通过这次改造获得了公司的好绩效,并将这种规则引擎的能力,提供给其它系统使用,真正实现了开发驱动业务。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,“长按”或“扫描”下方二维码噢:

2adab1f1a4c3c5cbe079e6d588de6072.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

1448fd9969f53b4861a1ebb97fced62d.png

a633d7f37a1829c4353efbefda768fa5.png1a0febdcb6439f5e72750c014678aa5d.pngcff1844e9375b15381f42bc426e2c3bf.png3754d35ddc9c279aaeb09fe0b109e77b.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
规则引擎--QLExpress:普通表达式的运行 特别说明:代码执行过程中会有各种缓存,避免指令的重复生成,可提高运行效率。 阅读详情

相关推荐

记一次有趣的报价规则引擎系统设计

转一篇我发在medium的文章,过两天我自己来翻译一下,还会补充一些技术细节: https://medium.com/@snowmanjy/an-interesting-system-design-of-a-rule-engine-prototype-29255e87b377 ...

snowmanjy 1972

阿里开源规则引擎QLExpress-入门实战

通过成熟的规则引擎算法,可以高效的调度通用的业务规则,从而将业务和规则进行隔离,在解藕业务代码的同时可以提高传统业务规则的计算效率,然而目前可以做到的开源的框架推荐用阿里的QLExpress,通过QLExpress可以通过底层的表达式算法缓存处理高性能的处理大批量的业务规则

JackieJia的博客 2万+

Flink规则引擎实践分享

Flink规则引擎实践分享 文章目录Flink规则引擎实践分享一、实时规则引擎架构***二、规则抽象模型三、规则、条件查询封装**3.1规则封装3.2 查询规则封装四、使用ClickHouse来存放明细并实现查询服务支持4.1 ClickHouse从Kafka摄取数据4.2 ClickHouse查询服务中的sql设计**4.3 ClickHouse查询时间跨度问题与解决**4.4 查询路由模块**五、项目中优化的点5.1 规则匹配方式优化5.2 行为明细规则匹配查询CK并发过高的解决方案 Java、大数

weixin_38836273的博客 4759

轻量高效、灵活可扩展!了解下Alibaba QLExpress规则引擎的魅力

QLExpress是一个基于Java语言的轻量级、高性能的规则引擎。它提供了一种简洁、灵活的方式来编写和执行规则,可以用于实现复杂的业务逻辑和决策过程。总的来说,QLExpress是一个功能强大、易于使用的规则引擎,具有高性能、灵活性和扩展性等特点。它可以帮助开发人员快速实现复杂的业务逻辑和决策过程,提升系统的灵活性和效率。

程序员野蛮成长 2596

Drools规则引擎

Drools(Drools Rule Engine)是一个开源的规则引擎,它主要用于在Java应用程序中实现规则管理。Drools规则引擎将规则定义和管理从应用程序代码中分离出来,使得规则可以独立于应用程序运行。这样可以提高规则的可靠性和可维护性,同时也可以使得规则的更新和管理更加方便。将规则定义和管理从应用程序代码中分离出来,使得规则可以独立于应用程序运行。提供基于规则的访问和操作数据的功能,例如过滤、排序、检索等。支持动态规则扩展和维护,可以根据需要添加、删除或修改规则。

BadBoyxiaolin的博客 1万+

掌握 QLExpress:阿里巴巴开源的业务规则动态解析神器

QLExpress(Quick Language Express)是阿里巴巴开源的一门动态脚本引擎解析工具,起源于阿里巴巴的电商业务,旨在解决业务规则、表达式、数学计算等动态脚本的解析问题。线程安全:QLExpress被设计为线程安全的动态脚本引擎,它使用类型的临时变量,确保在引擎运算过程中的并发场景下的线程安全性。高效执行:为了提高执行效率,QLExpress在编译过程中可以将比较耗时的脚本编译结果缓存到本地机器。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 12万+

记一次使用规则引擎改造任务系统获得晋升的好经验

往期热门文章:1、盘点Lombok的几个骚操作2、能用到“退休”的 600条 Linux 命令,可以解决日常99%的问题~3、EasyExcel,被救了!4、Star18.8k,水平可扩展的 MySQL 集群5、真实案例告诉你:进程CPU飙升到900%,怎么处理?来源:juejin.cn/post/7401403660246614070前言笔者在去年接手了公司的活动中台,其中【任务】,是活动当中必...

Java后端技术 213

使用规则引擎改造Java任务系统

公司的活动中台,其中【任务】,是活动当中必不可缺的玩法之一。相信大家都在各种各样的互联网活动中体验过【任务】。打车软件去完成一笔订单可以给用户发一个奖品;如用户去申请白条的额度,就能给用户发放京豆;从技术思维上,以上的流程,可以抽象成,用户完成某个动作,就给用户发放对应的奖品。作为中台的任务系统,往往会对接上游N个业务方的不同任务,并且任务也会有不同的完成条件。如:电商业务:用户支付一笔3000元以上的订单,完成【订单任务】

wjianwei666的专栏 178

规则引擎开发日记1

最经有项目要用到规则引擎,所以要去研究下相关技术,果然有点不容易,光下载部署就用了我很长时间,现在将规则引擎的学习日记记下来,当然相当一部分是从网上找的方法。 首先是找一份好的学习资料。 其中http://www.iteye.com/topic/94325上面的三篇文章写的很不错,根据上面的方法安装drool4.0.7.在安装的时候有一个失误,现在告诉大家,我用的是myEcl...

sjj5395426的专栏 210

【微服务】java 规则引擎使用详解

java规则引擎使用详解

congge 1万+

ctfshow---sql注入(171-213)

这里提一句,为什么不直接替换成acb这种,因为,flag原本就有字母,还原的时候会全部都还原成数字的,数字替换成符号应该也是可以的,这边测试了下除了&#好像别的符号都可以。插入查询后查询语句就会变成这样,由于id=11111这是一个不存在的id,而后面1=1又为真,所以会查询到表内所有的内容,--+是注释后面的字符。因为接受username的时候没有用引号,所以接受单纯的数字,而数字和字符比较会转换类型,字符串会变成数字0进行比较,所以相等。

fainpo的博客 1324

3步搞定任务系统改造:规则引擎实战指南,开发效率提升80%

笔者在去年接手了公司的活动中台,其中【任务】,是活动当中必不可缺的玩法之一。相信大家都在各种各样的互联网活动中体验过【任务】。比如:打车软件去完成一笔订单可以给用户发一个奖品;如用户去申请白条的额度,就能给用户发放京豆;从技术思维上,以上的流程,可以抽象成,用户完成某个动作,就给用户发放对应的奖品。作为中台的任务系统,往往会对接上游N个业务方的不同任务,并且任务也会有不同的完成条件。用户支付一笔3000元以上的订单,完成【订单任务】

m0_73735578的博客 1013

uniapp无感刷新token实现过程

可以看到已经触发了刷新token接口,并且重新请求上次失败的列表接口,无感刷新token逻辑已经正常,但为什么列表接口请求成功,还一直loading没关闭捏,就是因为后续代码未执行,await接口的返回没有成功resolve。路漫漫其修远兮,前端道路逐渐迷茫,时隔好久好久终于想起了我还有一个小博客,最近在一直在弄uniapp,属实有被恶心到,但也至少会用了,最近实现了一个比较通用的功能,就是无感刷新token,但在过程中发现一个问题就是。3、排查await的列表接口为何没有成功resolve。

weixin_40618068的博客 3595

3步搞定任务系统改造:规则引擎实战指南,开发效率提升80%!

点击上方“程序员蜗牛g”,选择“设为星标”跟蜗牛哥一起,每天进步一点点大厂程序员一枚 跟蜗牛一起 每天进步一点点31篇原创内容公众号笔者在去年接手了公司的活动中台,其中【任务】,是活动当中必不可缺的玩法之一。相信大家都在各种各样的互联网活动中体验过【任务】。比如:打车软件去完成一笔订单可以给用户发一个奖品;如用户去申请白条的额度,就能给用户发放京豆;从技术思维上,以上的流程,可以抽象成,用户完成某个动作,就给用户发放对应的奖品。

976

VSCode玩转STM32:手把手教你配置EIDE插件与OpenOCD调试(附野火DAP配置文件详解)

本文详细介绍了如何在VSCode中配置EIDE插件与OpenOCD进行STM32开发,特别针对野火DAP调试器提供了配置文件详解。从基础环境搭建到深度调试技巧,帮助开发者高效完成STM32项目开发,实现现代化嵌入式开发工作流。

weixin_26905487的博客 553

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2848

规则引擎 Drools

规则引擎 Drools 文章目录规则引擎 Drools1. 问题引出2. 规则引擎概述2.1 什么是规则引擎2.2 使用规则引擎的优势2.3 规则引擎应用场景2.4 Drools介绍3.Drools入门案例3.1 业务场景说明3.2 开发实现3.3 小结3.3.1 规则引擎构成3.3.2 相关概念说明3.3.3 规则引擎执行过程3.3.4 KIE介绍4. Drools基础语法4.1 规则文件构成4.2 规则体语法结构4.3 注释4.4 Pattern模式匹配4.5 比较操作符4.5.1 语法4.5.2 操

Backend Engineer API Integration | System Design | Architecture Growth 5845

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?...

莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性...

weixin_39948247的博客 1760

规则引擎概述及选型

规则引擎概述及选型

NarutoConanKing的博客 3万+

Android 13.0 SystemUI下拉状态栏背景增加高斯模糊背景

在13.0的产品开发中,发现现在很多产品都是高斯模糊背景的,这种高斯模糊背景看起来效果很不错,产品开发需要SystemUI下拉状态栏背景也是高斯模糊背景,所以就要来实现下拉状态栏高斯模糊背景

安卓兼职framework和app工程师的博客 2671

uniapp [全端兼容] - 实现人脸识别对比+人脸相似度,从相册选择或拍照上传两张图片进行人脸对比得到人脸相似度及判断是否是同一个人,人脸活体检测及对比(免费纯前端方案+调用第三方API接口方案)

uniApp人脸对比 人脸对比识别 人脸对比相似度,uniapp实现获取手机摄像头权限,调用相机拍照实现人脸识别相似度对比,uniapp实现人脸识别对比,计算两张人脸的相似度,从而判断是否同一个人,并给出相似度评分。uniapp H5网页如何实现人脸相似度比对,uniapp纯前端怎么对比两张图片的相似度,计算两幅图像的相似度,图像相似度对比方法,UNI-APP人脸相似度对比,快速识别两张照片的相似程度(用百分比)图片相似度对比在线测试,图片相似度对比,uniapp微信小程序人脸相似度对比分析,uniapp

🏆 前端领域优质创作者 5021

【规则引擎】

规则引擎

小祥的博客 2万+

司法AI系统的架构设计:法律知识图谱如何辅助智能庭审?架构师亲测

简单来说,法律知识图谱是一种采用图数据结构(节点Node + 边Edge/关系Relation)来组织和表达法律领域知识的语义网络。它以。

AI 算法实战派 1088

Java各种规则引擎

https://www.jianshu.com/p/41ea7a43093c https://segmentfault.com/a/1190000020330741?utm_source=tag-newesthttps://baike.baidu.com/item/%E8%A7%84%E5%88%99%E5%BC%95%E6%93%8E/3076955?fr=aladdin 一、规则引擎使用场景: 用于页面,流程,扩展点实现的选择;输出结果:实现的位置; 编排无数的条件积木和行为积木,达到业务逻

yb223731的博客 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

上一篇: SpringBoot + minio + kkfile 实现文件预览
下一篇: 大厂都在用的分库分表 12 种分片算法
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值