规则引擎:大厂营销系统资格设计全解


640?wx_fmt=png


640?wx_fmt=png

以上是目前苏宁金融这边针对资格设计的分类:静态资格、动态资格和风控资格。此处风控资格校验作为独立的一个分类并且放在最后,主要是由两个方面考虑:(1)风控的内容很多,在苏宁金融有专门的风控中心来进行风控规则的制定和执行;(2)风控返回的风控级别也有很多,营销活动的不同、触发风控的级别不同,对应的营销活动处理逻辑也不一样。


下面针对以上的分类的静态资格和动态资格进行相关的领域模块具体设计探讨。


静态资格

静态资格在苏宁金融营销中的定义是:用户进入具体场景、当时用户属性标签的一个静态数据。


静态数据的获取方面主要通过两个部分获取:(1)上游系统的传递,这个数据主要是获取用户所处的场景数据,包括但不限于:用户当前进行的业务及业务数据、用户使用终端、网络环境等等数据。(2)用户属性标签的大数据获取。在苏宁金融大数据中心有一套完整的用户实时标签库,用户请求后通过次标签库实时查询用户目前的标签。


静态数据的过滤在技术方案中适合采用规则引擎进行相关资格校验。目前在苏宁金融的营销系统中使用Drools,主要是考虑以下几个方面:

(1) 业务规则较多,如果使用编码方式新增规则就需要进行相关的编码,增加代码量和维护成本。

(2) Drools的自定义关系操作符:通过自定义关系操作符可以针对不同的业务规则配置需要的操作符还可以针对每个活动不能匹配的原因进行内部埋点记录,方便运营进行客诉查询。

(3) 纯java实现,学习成本低。


业务配置生成drl文件设计

关于生成drl文件的设计,先来看看drools引擎原理:

640?wx_fmt=png

Drools引擎通过每个条件进行匹配,最终匹配出相关的活动,所以在设计中需要考虑最终返回的数据是活动集合。


Drl文件组成:

640?wx_fmt=png


通过原理及文件组成,设计Drl文件生成的类图如下:

640?wx_fmt=png

writeRuleFile是入口,通过入口进行内部方法组装,此方法需要功能是组装文件内容和写文件;writeDrlHead方法为写文件头部包、引用和全局变量定义;assembleEvaluatorDefinition方法是组装自定义操作符规则;getActRuleWhenCondition此方法为拼接规则字符串;writeActivityRule此方法为活动的规则写入。


以上是一种纯java代码实现Drl文件生成的一个方式,目的是为了让大家能够理解Drl文件的结构。实际操作过程中也可以通过freemarker模版来生成对应的Drl文件。


Drools规则加载

此处规则加载设计可以设计为内置定时器扫描规则生成表是否有新增记录或者采用分布式集群通知的方式进行加载。

640?wx_fmt=png

640?wx_fmt=png

目前,苏宁内部的统一配置平台采用的是自研的SCM平台,能够很好地支持实时修改,应用服务器集群每台应用监听具体某个配置文件的内容变更。


应用服务器监听到需要进行Drl文件 加载后,通过拉取Drl文件,并读取其中的内容生成对应的KieBase。


静态资格匹配

为了更加通用性在设计中可以设置规则匹配的入参为Map形式,在进行匹配前需要把静态资格数据转化为Map数据格式,然后在生成的KieBase中获取KieSession,通过此KieSession进行规则匹配。


KieSession需要设置全局的一个集合,来返回匹配到相关活动编码数据,同时需要考虑活动是有状态和有效期的,所以在拿到静态数据匹配的活动编码后,需要对活动的状态进行筛选,拿到的是生效且在有效期范围内的活动。


动态资格

此处动态资格主要是指活动的次数和用户次数。营销活动为了能够使更多的用户能够参与,防止某些用户的重复参与,会对用户的每日、每月、总参与次数进行限制,同时活动的经费是有限的,为了能够使营销活动效果做的更好,也会对活动的每日、每月、总次数进行限制。


动态资格设计可以分为两个维度,一个是对象,一个是周期:

640?wx_fmt=png

通过上图设计,周期维度确认好后变更的可能性比较小,可以在前期调研阶段确认好周期范围。不过,对象变更相比较周期而言会更频繁,前期系统上线的时候确认一个自然人可能只有帐号、绑定手机两个属性,后期通过系统的不断迭代及技术的不断进步这个属性可能会进行扩容。所以,在进行架构设计的时候需要考虑具体对象的扩展性。同时,为了高并发的查询、次数的扣减或者回滚,可以通过缓存来代替数据库的记录和操作,当然为了保证数据的可恢复性,可以设计实时缓存,异步落库的操作。


动态资格组装

资格组装按照分析,采用抽象类封装内部实现,每个对象通过继承抽象类,实现具体的抽象方法的方式来实现。

640?wx_fmt=png

其中,各个基类的设计如下:

类名

类含义

属性

含义

UserInfoDto

用户信息

userId

用户ID

mobilePhone

绑定手机

…   …

其他用户的属性内容

DynamicConfig

动态配置

activityCode

活动编码

period

周期

limitType

限制具体对象

limitNum

限制动态次数

DynamicRecord

动态记录

dynamicKey

动态key

expire

过期秒

value

动态增加次数(默认1)

maxValue

限制次数

activityCode

活动编码

targetValue

具体对象值

period

周期

抽象类AbstractDimensionDynamic中有两个抽象方法获取对象targetType和获取对象值targetValue是在具体类中进行实现。dynamicAssemble方法是进行dynamicKey的拼接并组装动态资格的具体对象,最终得到动态资格对象的集合。


AbstractDimensionDynamic的子类是具体的动态资格对象,每增加一个对象,通过增加子类的方式来实现。


动态资格服务

640?wx_fmt=png

此处设计中DynamicService对外提供的是动态资格校验和动态资格扣减两个服务,在实际过程中还会存在回退的服务,这个需要自行进行扩展。


抽象类AbstractDynamicService中的dimensionDynamics是一个List,并且注解为@Autowired,Spring会自动从容器中取出DimesionDynamic的实现类装配到List类型的dimensionDynamics中,从而简化了依赖注入的过程,并且有新增实现类的时候系统启动会自动注入。


@Autowired
private List<DimensionDynamic> dimensionDynamics;

@Resource
private RedisService redisService;


其中的assembleDynamicRecordList方法是通过遍历dimensionDynamics,组装需要的查询或者扣减的动态数据记录;rollback方法是扣减出现异常或者扣减超过限制后进行回滚使用的操作,此方法需要抛出异常,供上游判断是否需要进行处理。


缓存使用Redis,主要是考虑在redis中的incrBy和decrBy都是原子性操作,这个在高并发的场景中防止由于并发导致的累计错误问题。而且redis的mget命令可以批量查询,主要是由于redis使用基于RESP协议的rpc接口,而redis本身的数据结构非常高效,所以IO和协议解析是个不容忽略的资源消耗。通过mget将多个get请求汇聚成一条命令,可以大大降低网络、rpc协议解析的开销,从而大幅提升缓存效率。


DynamicServiceImpl是DynamicService的具体实现,并且要继承AbstractDynamicService抽象类。需要实现dynamicChack动态资格校验和dynamicDeduction动态资格扣减方法。


动态资格校验是通过组装的动态记录数据集,到缓存中查询目前存储的值跟对应动态资格最大值进行比较,当缓存值大于等于最大值表示动态资格校验不通过。


动态资格扣减使用缓存的incrBy进行累加,这块需要针对每个累加后进行判断来减少跟缓存的交互,并且需要把已经累加的数据进行记录,提供回滚资格使用。


以上是针对营销系统的资格设计的一个设计思路和相关实践的简单案例,在具体设计中需要考虑的问题比案例中的更加复杂。比如:用户资格不满足原因的输出、异步动态资格数据入库处理、动态资格校验返回所有不满足原因等等。这些就需要进行相关的扩展和针对目前公司的基础配套设施的情况进行选择设计。


作者介绍 :
王海民,苏宁金融研发中心高级技术经理,主要负责苏宁金融会员及互联网研发中心的营销部门工作。具有营销、电商、支付、金融等相关领域 10 年以上工作经历;擅长互联网产品服务端应用技术架构。


  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在移动互联网时代,各式各样的新业务和新产品不断出现,通信市场的用户总体规模增长速度变缓,使运营商之间的竞争愈加激烈,新产品营销的时效性和准确度问题亟需解决。实时营销作为新的营销方式,具有较高的实时性,通过运用大数据分析技术分析用户上网行为特征,并在合适的时间、合适的地点向用户推荐合适的内容,从而提升用户感知、增加用户粘性。如何运用大数据技术实现实时营销是本文的重要内容。本文深入调研分析了大数据实时流式处理技术,并结合其在满足非功能性需求方面的独特优势,设计了一个可以同时满足大数据存储、大数据实时性分析的实时营销系统。该系统采用了实时数据处理与离线数据处理相结合的架构。其中离线数据处理系统通过采用Hadoop集群将用户数据进行标签。实时数据处理系统首先将实时数据以日志的形式存储在Flume中,然后再通过Strom和Spark Streaming工具对实时数据进行实时处理与分析,并对数据进行标签。将生成的标签存储在Redis数据库中。实时营销系统的核心是通过分析电信用户DPI(Deep Packet Inspection,深度包检测)数据、挖掘用户上网特征、添加用户标签、发现目标用户,并采用个性化插件包对用户提供个性化的营销服务。本文的主要研究内容为:(1)实时营销系统的需求分析。结合电信运营商的营销系统的时效性差并且效率低下的现状,通过运用大数据的技术手段和方案,在基于上海电信海量的DPI数据的基础上,为用户进行实时性的推荐。在明确系统目标的前提下,完成对整个系统的需求分析,包括功能性需求(如营销商品管理、营销任务管理、营销规则管理、发送规则管理、营销效果评估)和非功能性需求(如流式框架每秒处理10万条DPI数据,时延少于500毫秒,可处理TB级以上的数据)。然后采用用例图对功能性需求进行建模。(2)实时性营销系统的总体架构设计。基于实时营销系统需求分析的基础上,提出了离线数据处理与实时数据处理相结合的总体架构。首先选择出流式处理平台的相应组件,然后采用流式处理组件串联结构,同时以CORE为核心调用相关模块进行实时营销的策略模式,对系统进行了全面的部署。通过对离线数据和实时数据分别进行标签处理,利用标签对用户进行多维度的画像,全面反应用户特征,使得营销过程更加精准化。(3)实时性营销系统的具体设计与实现。根据系统的总体架构设计,本文主要从三个方面完成了基于流式计算的电信实时营销系统设计与实现。解决实时数据的传输问题:流式计算数据处理系统需要进行对实时信息进行及时、不间断地处理。Flume从节点上实时采集数据并将数据以日志的形式存储。Kafka负责低时延的收发日志数据。Storm系统读取Kafka中的数据,并及时的处理,保证处理的稳定性和时效性。Spark Streaming完成对数据的实时分析,保证在复杂度高的分析时具有较高的实时性。Storm系统与Spark Streaming系统共同部署在YARN上,完成了平台的整合与数据资源共享,节省了网络开销。解决精准性营销的问题:通过对电信的DPI数据进行分析,建立用户标签库,对用户进行画像。通过数据挖掘算法发现目标用户群以及用户的触点事件,建立相应的营销规则,当事件发生时触发实时营销动作。这是一个需要不断更新和完善的过程,通过建立正确的营销反馈体系和良好的反馈机制,使实时营销更加精准。利用个性化插件包解决个性化业务的需求问题:利用Mysql数据库和自定义应用程序接口,针对不同的业务场景开发不同的插件包,使实时营销具有可拓展性。(4)实时性营销系统的测试及结果分析。从系统的可行性和性能方面进行了验证和分析。在可行性方面,系统能够实现预期的功能,同时输出相对应的结果,并以明星机推送的场景实例对系统进行验证;在性能方面,分别对Storm和Spark Streaming的性能进行测试,并给出了结果分析。本文提出的实时营销系统能够清晰全面的掌握用户特征与习惯信息,为用户提供个性化定制的营销服务。在竞争激烈的移动增值业务市场中,率先满足用户的需要,得到用户的青睐,同时减少用户的流失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值