规则引擎的技术创新说明
背景
致力于为客户提供 客户忠诚度计划的科技,几年来为很多包括邮电、银行、航空等不同行业客户提供的 积分商城的 开发与运营工作,得到了客户的广大认可。但如何为客户提供 积分计划(即客户忠诚度计划)?而且,不同行业的积分计划输入要素(如航空关心不同座舱,银行可能关心不同的卡片等级),积分逻辑更是不同(按单笔奖励积分,按一定区间次数或合计额度奖励等)。势必涉及到不同行业积分计划的定制化,如何定制化后不必重启系统,而使业务人员能方便的管理积分计划?所有这些需求,都使得 有必要开发一套 积分计划引擎(规则引擎),使得可以面对不同行业的不同逻辑的积分计划。我在加入科技后,最初以xx积分需求为切入点,开发了 公司自主技术的 规则引擎组件。
规则引擎定义
规则引擎是一套可以运行很多规则模板(以下简称模板)的引擎系统,被用来运行不同行业不同规则和逻辑的。不必对每个行业重新开发规则系统,只开发 发生变化的 模板部分即可,缩短了对不同规则的定制化开发时间,提高了实施效率。
结构以及设计思路
规则引擎就是一套计算框架,使得维护规则逻辑从代码中分离出来,方便的维护规则逻辑。
引擎结构如下:
引擎部分(整体部分):
模板自动加载(无需重启)
将模板编译后的class文件保存在共享文件系统中,而非java虚拟机的classpath中。这样可以动态加载类,而不需要重新启动系统。保存在共享文件系统中的好处,在于在集群环境中都可以访问到这个class。
到文件系统加载类,需要用到动态类加载技术。
规则常驻内存
每当规则发送变化,更新内存中的规则。
整点(整日)扫描规则,对于 需要启动的规则进行加载
运行规则时,先从内存中读取,内存没有再到文件系统加载。
。
提供session数据框架
提供key-value结构的session数据,并提供管理功能。
模板部分(积分规则)
输入要素定制化
定义基本交易类型PiaolTrade ,要素含常用的用户id、交易码、交易时间、交易地点、交易送达终端类型、交易涉及商品的数量、名称、金额;其他行业可以继承这个对象并扩展。
引擎并不知道具体业务对象,模板中对应具体业务对象。
输出要素固定
输出要素为:
计算结果是否成功,
所获积分,
备注的文本信息
可以操作session数据
使用引擎提供的对session数据读取、保存操作。
积分中间数据,即上面提到的session数据。
待积分业务流水:送到规则引擎的外部业务系统的流水。
计算计算结果:即模板中的输出结果。
规则参数自动生成
因为不同模板的参数不同,需要根据基于特征字模式匹配,自动识别出模板中的参数,供业务人员输入。
如对规则逻辑代码:
String 不积分商户=rule.parameters.get(“不积分商户”);//@参数说明@不积分的商户,用逗号隔开 |
将自动识别出 “不积分商户”这个参数,以及这个参数的解释“不积分的商户,用逗号隔开”.
好处
针对不同行业可以定义不同的业务对象。
定义不同的积分逻辑
模板在线上传,新建规则自动生效
积分计划逻辑常驻内存,无需访问硬盘,极速计算。经北京核心团队测试人员测试,处理500的并发游刃有余。
如何使用
业务人员根据市场需要,书写规则逻辑的文件。
>模板工程师根据市场提供的逻辑文件,编写 对应的模板(为java文件),测试并上传。
1) 可用得到交易对象,规则参数值
2)书写逻辑。包括数值、字符的比较判断,字符的包含判断,数值的四则运算等等。
3)写返回的积分结果对象。
业务选择模板,确定模板中的参数(如积分比例,哪些pos要过滤等)建立一条规则。
引擎自动加载这条规则,并负责它的解释。
当业务系统的交易数据送到引擎时,引擎将该业务数据和模板结合并执行模板。
引擎输出的积分,可以外接账户系统(也可以不接),进行积分入账。
应用
积分奖励计划
其他 所有 基于 使用给定规则,做判断或计算的任何场所。
如抽奖(定义各等级奖品抽中概率、奖品数量、单用户抽中次数)。
商城各种活动规则等。
应用案例
基于此引擎,
2015年,开发了xx规则模板:
连续签到奖励,下单奖励等。
2015年夏,在积分1.5版本中,开发了中心端奖励模板:
注册奖励、推荐奖励、积分转入转出奖励、积分消费奖励、积分充值奖励。
2016年,在积分商城中增加的抽奖互动活动中,开发的抽奖模板,也是靠此引擎运行。
邢立军,2016.4。