货拉拉-营销活动-玩法引擎建设
背景
随着货拉拉业务的不断发展,业务侧不断探索精细化活动运营策略,以拉新、促活、转化和留存等多个环节为切入点,不断丰富和完善营销活动玩法。随着营销活动玩法的不断迭代,原有的活动玩法架构已经不足以支撑活动玩法的开发迭代。原有的活动玩法代码在玩法间存在高度耦合,不利于后续需求的迭代,如活动玩法新增、玩法代码改动;改动到玩法的公共代码时,影响的活动玩法都需要回归测试,增加测试工作量;代码中还存在滥用ThreadLocal传递参数、再次查询缓存和db的情况,影响了服务性能。基于以上问题,我们设计了营销活动的“玩法引擎”,玩法引擎不仅有一套开发契约,活动玩法遵循该契约就能实现代码开发隔离、运行隔离;也有一套可以规避代码腐化的开发机制,活动玩法开发必须遵循该机制;还有一套用于业务流程编排的能力抽象设计,用于支持活动玩法的流程编排。
1.活动玩法介绍
2. 玩法引擎介绍
2.1 为什么要设计玩法引擎?
2.1.1 活动玩法现状
2.1.2 为什么要自建引擎?
为什么要自建引擎,而不用成熟的流程引擎?
玩法引擎的设计目标:
2.2 玩法引擎设计
2.2.1 玩法引擎分层设计
玩法引擎在活动玩法上分三层,最上层是活动玩法层,中间层是能力编排层,最底层是流程节点层。
2.2.2 玩法能力构建
能力构建演化
为什么能力存储使用二级存储结构?
为什么流程节点标识作为一级存储结构,玩法类型作为二级存储结构?
基于以上几点考虑,最终选择了第二种方式;把流程节点前置,玩法后置,理念有点类似于倒排索引。这种设计思想,可以适用于各个业务,并支持在已有能力的基础上赋能新业务。
2.3 玩法引擎编排
2.3.1 引擎编排维度
2.3.2 玩法能力接口
为什么玩法能力接口是两个方法,而不是一个方法?
2.3.3 能力编排设计
不同活动的页面渲染编排举例
2.4 引擎执行流程
2.4.1 玩法配置文件
2.4.2 玩法执行流程
3. 玩法配置举例说明
3.1 抽奖活动玩法样例
使用到的能力
抽奖活动页面渲染编排举例
流程编排配置文件
{"start":"load.model","load.model": {"成功":"risk.access#lottery"},"risk.access#lottery":{"准入":"activity.access","不准入":"page.error"},"activity.access":{"准入":"activity.page#lottery","不准入":"page.error"}}
4.2 邀请好友活动玩法样例
使用到的能力
邀请好友活动页面渲染编排举例
流程编排配置文件
{"start":"load.model#inviteFriends","load.model#inviteFriends": {"成功":"activty.access#inviteFriends"},"activty.access#inviteFriends":{"准入":"risk.access#inviteFriends","不准入":"page.error"},"risk.access#inviteFriends":{"准入":"activity.page#inviteFriends","不准入":"page.error"}}
4. 未来规划
1. 玩法引擎后续将提供丰富的可视化功能,如能力的可视化、玩法流程的可视化。
2. 玩法配置文件后续将支持动态创建、动态加载、动态生效功能,支持活动玩法的一键上线。
3. 玩法引擎的编排暂不支持单个能力多次调用的编排(如A->B->A,此时A会出现循环调用),后续玩法引擎扩展将支持更多的流程编排文件解析器