当前位置:首页 > 技术分享 > 正文

ZCube:在我的优惠券中的落地实践 | 京东云技术团队

前言一、背景1.1现状1.2挑战点1、营销中台每次新增券类型,都需要运营指定营销文案后,由研发硬编码实现。能不能支持业务运营人员根据需求灵活扩展,动态配置营销文案,并且能够及时生效呢?2、消息中心的push提醒文案需要跟营销展示文案一致,那就由业务侧研发硬编码实现一套,消息中心侧实现一套,并且还得保...

前言一、背景1.1现状1.2挑战点1、营销中台每次新增券类型,都需要运营指定营销文案后,由研发硬编码实现。能不能支持业务运营人员根据需求灵活扩展,动态配置营销文案,并且能够及时生效呢?2、消息中心的p......

前言

一、背景1.1现状


1.2挑战点

1、营销中台每次新增券类型,都需要运营指定营销文案后,由研发硬编码实现。能不能支持业务运营人员根据需求灵活扩展,动态配置营销文案,并且能够及时生效呢?

2、消息中心的push提醒文案需要跟营销展示文案一致,那就由业务侧研发硬编码实现一套,消息中心侧实现一套,并且还得保证两处的规则逻辑一致才可以。
能不能将这种相同的规则抽取出来,以订阅的方式下发到订阅者上去,既保证规则的唯一性,也能够做到规则共享?

二、解决方案

鉴于上述场景的痛点,我们接入ZCube平台来解决

2.1接入ZCube

官网地址::《ZCube:会员权益体系规则引擎原理介绍【一】》

首先,在ZCube平台接入我的优惠券应用


搭建优惠券运营玩法规则


展示逻辑映射规则


发布知识包


2.2应用系统接入SDKmaven坐标依赖
!--规则引擎客户端/groupIdartifactIdrule-core-client-spring//version/depency
properties参数配置
==jrm_member_==xxx



springxml配置
?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/beans
api调用
RuleExecutionResultruleExecutionResult=(knowPackageName,param);
2.3AB方式灰度上线

为了保证现有功能的稳定,我们采用AB方式灰度上线,配置在白名单内的用户走规则引擎执行的逻辑,否则走原硬编码逻辑。


三、结果展示

C端页面展示


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



四、改造后的优势

1、营销中台新增品后,只需要在策略中心可视化配置,0代码
2、策略规则支持热部署,发布审批即生效
3、业务规则以知识库形式存储,所见即所得,便于业务侧优惠券资源治理

五、压测5.1压测对象

--

描述

备注

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方法监控

5.4结论

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执行

最新文章