
前言一、背景1.1现状1.2挑战点1、营销中台每次新增券类型,都需要运营指定营销文案后,由研发硬编码实现。能不能支持业务运营人员根据需求灵活扩展,动态配置营销文案,并且能够及时生效呢?2、消息中心的p......
前言
一、背景1.1现状
1、营销中台每次新增券类型,都需要运营指定营销文案后,由研发硬编码实现。能不能支持业务运营人员根据需求灵活扩展,动态配置营销文案,并且能够及时生效呢?
2、消息中心的push提醒文案需要跟营销展示文案一致,那就由业务侧研发硬编码实现一套,消息中心侧实现一套,并且还得保证两处的规则逻辑一致才可以。
能不能将这种相同的规则抽取出来,以订阅的方式下发到订阅者上去,既保证规则的唯一性,也能够做到规则共享?
鉴于上述场景的痛点,我们接入ZCube平台来解决
2.1接入ZCube官网地址::《ZCube:会员权益体系规则引擎原理介绍【一】》
首先,在ZCube平台接入我的优惠券应用



!--规则引擎客户端/groupIdartifactIdrule-core-client-spring//version/depencyproperties参数配置
==jrm_member_==xxx


?xmlversion="1.0"encoding="UTF-8"?beansxmlns=""xmlns:xsi=""xsi:schemaLocation=""default-lazy-init="false"beanid="ruleExecuteService"class=""propertyname="knowledgeCacheService"ref="knowledgeCachePushService"//beanbeanid="knowledgeCachePushService"class=""propertyname="cloudFileInnerService"ref="cloudFileInnerService"//beanbeanid="cloudFileInnerService"class=""constructor-argindex="0"value="{frozenParamBean['']}"/constructor-argindex="1"value="{frozenParamBean['']}"/constructor-argindex="3"ref="knowledgeCachePushService"//bean/beansapi调用RuleExecutionResultruleExecutionResult=(knowPackageName,param);2.3AB方式灰度上线
为了保证现有功能的稳定,我们采用AB方式灰度上线,配置在白名单内的用户走规则引擎执行的逻辑,否则走原硬编码逻辑。

C端页面展示

SGM执行方法监控,tp99基本在1ms,cpu及内存较稳定,对系统原业务逻辑基本无影响


1、营销中台新增品后,只需要在策略中心可视化配置,0代码
2、策略规则支持热部署,发布审批即生效
3、业务规则以知识库形式存储,所见即所得,便于业务侧优惠券资源治理
--
描述
备注
1
压测案例项目
SDK客户端示例项目
fin-rule-client-example
2
压测机器
用户持有优惠券接口
接口:别名:fin-rule-client-example
3
执行知识包01exePackage01执行知识包03exePackage03执行aviator01exeRule03
SDK客户端示例项目
fin-rule-client-example
4
压测机器
指定预发机器
11.248.242.133100.99.122.24
5.2压测平台forcebot压测平台
压测脚本:
压测方法
压测脚本
1
exePackage01
2
exePackage03
3
exeRule03
exePackage01@TestSuite(value="forcebot",lifecycle=,ratePolicy=)classTestQueryRightsCardDetail{publicfinalLoggerlogger=;publicstaticGenericServiceInvokergenericServiceInvoker;publicstaticAsciiFileAccessArbitrarilyrealPinFile=newAsciiFileAccessArbitrarily("test_1w_");static{genericServiceInvoker=newGenericServiceInvoker();("","fin-rule-client-example");}StringgetPin(){().trim();}@TestCase(record=false)voidqueryRightsCardDetail(){//真实pinStringpin=getPin();("pin:{}",pin);StringtranName="exePackage01";JSONObjectparam=newJSONObject();("pin",pin);("clientIP","127.0.0.1");StringstrParam=(param);try{(tranName);Objectresult=("exePackage01",newString[]{"",""},newObject[]{45,45});("{}result:{}",tranName,result);booleanret=resultCheck(result,tranName);}catch(Exceptionex){(tranName);((),ex);}}booleanresultCheck(Objectresult,StringtranName){if(result==null){("{}execerror,resultisnull.",tranName);returnfalse;}if(!(resultinstanceofMap)){("{}execerror,resultis{}.",tranName,result);returnfalse;}MapString,ObjectresultMap=result;(tranName+"result:{}.",resultMap);if(resultMap==null||()==0){("{}execerror,resultmapsizeiszero.",tranName);(tranName);returnfalse;}(tranName);//("{}execsucceed,result:{}.",tranName,resultMap);returntrue;}}exePackage03@TestSuite(value="forcebot",lifecycle=,ratePolicy=)classTestQueryRightsCardDetail{publicfinalLoggerlogger=;publicstaticGenericServiceInvokergenericServiceInvoker;publicstaticAsciiFileAccessArbitrarilyrealPinFile=newAsciiFileAccessArbitrarily("test_1w_");static{genericServiceInvoker=newGenericServiceInvoker();("","fin-rule-client-example");}StringgetPin(){().trim();}@TestCase(record=false)voidqueryRightsCardDetail(){//真实pinStringpin=getPin();("pin:{}",pin);StringtranName="exePackage03";JSONObjectparam=newJSONObject();("pin",pin);("clientIP","127.0.0.1");("orderType","ssahhh");("bizCode","qwerrtta");StringstrParam=(param);try{(tranName);Objectresult=("exePackage03","",strParam);("{}result:{}",tranName,result);booleanret=resultCheck(result,tranName);}catch(Exceptionex){(tranName);((),ex);}}booleanresultCheck(Objectresult,StringtranName){if(result==null){("{}execerror,resultisnull.",tranName);returnfalse;}if(!(resultinstanceofMap)){("{}execerror,resultis{}.",tranName,result);returnfalse;}MapString,ObjectresultMap=result;(tranName+"result:{}.",resultMap);if(resultMap==null||()==0){("{}execerror,resultmapsizeiszero.",tranName);(tranName);returnfalse;}(tranName);//("{}execsucceed,result:{}.",tranName,resultMap);returntrue;}}execRule03@TestSuite(value="forcebot",lifecycle=,ratePolicy=)classTestQueryRightsCardDetail{publicfinalLoggerlogger=;publicstaticGenericServiceInvokergenericServiceInvoker;publicstaticAsciiFileAccessArbitrarilyrealPinFile=newAsciiFileAccessArbitrarily("test_1w_");static{genericServiceInvoker=newGenericServiceInvoker();("","fin-rule-client-example");}StringgetPin(){().trim();}@TestCase(record=false)voidqueryRightsCardDetail(){//真实pinStringpin=getPin();("pin:{}",pin);StringtranName="execRule03";JSONObjectparams=newJSONObject();("orderType","1");("orderType","1");("bizCode",1);("subBizCode",0);("merchantCode","200022");("subMerchantCode","110597078001");JSONObjectparam=newJSONObject();("ruleId","bt");("params",params);StringstrParam=(param);try{(tranName);Objectresult=("execRule03","",strParam);("{}result:{}",tranName,result);booleanret=resultCheck(result,tranName);}catch(Exceptionex){(tranName);((),ex);}}booleanresultCheck(Objectresult,StringtranName){if(result==null){("{}execerror,resultisnull.",tranName);returnfalse;}if(!(resultinstanceofMap)){("{}execerror,resultis{}.",tranName,result);returnfalse;}MapString,ObjectresultMap=result;(tranName+"result:{}.",resultMap);if(resultMap==null||()==0){("{}execerror,resultmapsizeiszero.",tranName);(tranName);returnfalse;}(tranName);//("{}execsucceed,result:{}.",tranName,resultMap);returntrue;}}模拟调用:easyone接口调用
5.3压测指标监控SGM监控:
sgm方法监控
demo
tps峰值
tp99
tp999
成功率
内存使用率
cpu使用率
1
10000
1
1
100%
12.6%
31.6%
2
19500
1
1
100%
12.6%
53.7%
白条规则
tps峰值
tp99
tp999
成功率
内存使用率
cpu使用率
1
2500
1
1
100%
12.5%
9.88%
2
3000
1
1
100%
12.5%
11.1%
3
3500
1
1
100%
12.6%
13.0%
4
4000
1
1
100%
12.5%
13.9%
5
5000
1
1
100%
12.5%
17.9%
6
6300
1
1
100%
12.5%
21.6%
7
8400
1
1
100%
12.5%
26.9%
8
10500
1
1
100%
12.5%
33.7%
9
14500
1
1
100%
12.5%
46.1%
10
19200
1
1
100%
12.5%
59.2%
白条规则aviator执行
tps峰值
tp99
tp999
成功率
内存使用率
cpu使用率
1
6100
1
1
100%
12.4%
18.4%
2
10500
1
1
100%
12.4%
29.6%
3
20000
1
1
100%
12.5%
51.9%
压测tps指标
执行方式
SGM监控
JDOS实例监控
1
6000
aviator执行


2
6000
package执行


3
10000
aviator执行


4
10000
package执行


5
20000
aviator执行


6
20000
package执行