vivo积分任务体系的架构演进-平台产品系列05
作者:vivo 互联网平台产品研发团队- Mu JunFeng
积分体系作为一种常见营销工具,几乎是每一家企业会员营销的必备功能之一,在生活中随处可见,随着vivo互联网业务发展,vivo积分体系的能力也随之得到飞速提升,本篇主要介绍vivo积分任务体系的系统建设历程。
一、前言
1.1 什么是积分体系?
积分体系如今越来越普遍,是很多线上线下商家都会采用的用户消费激励体系,例如:淘宝的金币、京东的京豆等;此外,各大运营商、航空公司、连锁酒店、线下商超等也都有自己的积分玩法。积分的价值是连接用户,增加活跃、保持用户粘性。通过增加用户积分价值感的手段,实现业务内循环。
vivo积分体系能力已经非常丰富,主要包括以下能力:
积分商城:积分体系主入口,提供丰富的礼品兑换、活动玩法,强化积分价值感知
任务中心:重要的积分获取入口,引导用户了解业务、培养用户习惯的重要玩法
活动中心:提供丰富的活动玩法,增加积分体系的可玩性和丰富度,更好地提升用户参与度
vivo积分贯穿整个vivo生态下的互联网应用,同时手机厂商互联网业务的独特性(不仅局限于单一类型业务)也造就了vivo积分与其他行业生态积分体系的差异性,这些差异性着重体现在vivo积分是与各个业务形态紧密合作,相互渗透。如下图例显示在对应签到、任务中心都与业务方强相关联。

在积分体系里任务体系是很重要的一环,行业内会基于任务的形式刺激用户活跃,引导用户完成业务上高价值的行为,最终给予用户回馈(发放积分)。
1.2 什么是任务?
玩过游戏的同学都知道,游戏内日常都会有任务,有目的地指引玩家进行游戏活动,并给予玩家一定奖励。
对于积分产品(业务)而言,任务体系一般希望引导用户了解产品、提高产品活跃度、培养用户习惯,总而言之是期望用户在使用产品的过程中不断产生价值行为,通过直接或间接的方式帮助业务方达成业务指标,同时用户因完成任务得到奖励,有持续产生高价值行为的动力,最终形成正向循环。
1.3 福格模型
基于以上分析我们可以看出积分任务体现出来的是典型的“福格模型”,通过合理的奖励去推动符合业务价值的行为。

(图片来自网络,混沌大学)
福格行为模型是一个用来探寻用户行为原因的模型,它认为要让一个行为发生,必须同时具备三个元素:动机、能力、触发器。
也就是说,只有当一个人有足够的动机,并且有能力去做到,而且有能触发用户行动的触发器来提醒的时候,一个行为才最终可能发生。
那么vivo的任务体系是如何搭建的呢,系统建设又走过了哪些历程?在本次文章中我们将为大家慢慢揭晓。
二、发展
2.1 阶段一:初探
(1)业务模型分析
任务模型:“用户 A 完成了 B 动作发放 C 奖励(或者触发某种逻辑)”,我们将满足这种模式的需求定义为一个任务。
任务周期:结合业务场景,我们发现任务周期大致分为:新手任务(全局只能完成一次)、每日任务、每月任务。
任务状态:存储业务状态,包括任务的完成状态,以及奖励领取状态。
(2)系统目标
快速配置任务,按周期以及业务场景确定任务类型
记录任务完成状态及奖励领取状态
(3)实现方案

注:上图中“业务方”特指vivo生态下的服务方;“端侧”特指客户端APP。
如上图所示,阶段一的设计方案虽然有配置,但在逻辑层还是有很大的开发成本, 在阶段二我们着重解决定制化开发效率的问题。
2.2 阶段二:用户行为激励体系建设
(1)痛点分析
积分任务中心初版在线上运行一段时间后发现,虽然任务基础信息可以通过配置化完成,但远没有达到预期:通过配置化就能够实现任务快速上线。
回顾阶段一的设计,其实仅仅是引入了任务的定义与配置,但任务的行为以及达成判定都由业务方实现,在项目对接上有不少弊端:
跨项目协作周期长:跨项目管理难度大,进度对齐、沟通协调,case by case开发,系统耦合严重,灵活性低,业务方逻辑重、开发成本高。
业务上运营效率低:一个季度上线不了几个任务,加上数据分析周期,整体跨度长,效果不理想。

通过分析积分任务的业务场景,我们发现大多数任务行为都是app端侧产生的行为,比如用户在浏览器端浏览新闻给予积分奖励。
结合互联网业务都有日常埋点,我们很容易想到可结合埋点上报捕获用户行为,同时为了解决我们初版任务系统的弊端,我们重新梳理出vivo积分任务系统需要支持的核心功能点:
引入行为模型:建设集行为定义、采集、计算、触达为一体的模型体系
建设行为SDK:拉取行为配置、上报行为、行为在端侧支持过滤、任务完成触达提醒
支持实验能力:支持任务灰度测试能力,同时支持基于用户标签定向投放任务
(2)行为上报流程

(3)方案交互序列图

整体流程:
App 端启动时激活行为SDK拉取端侧行为配置
行为SDK针对上报的行为埋点,经过匹配、过滤、去重等策略,最终将行为上报
行为上报至服务端进行用户标签判断、实验策略判断、行为计算,最终将任务结果返回给行为SDK
行为SDK接收到响应后将奖励结果通过toast/snackbar将配置的UI交互展示给用户,用户可手动领取积分奖励,或者自动发放
(4)场景示例
用户浏览新闻,点赞资讯评论,行为SDK上报此事件,判定达成任务,返回snackbar提示用户手动领取奖励。

(5)业务效果
经过以上升级,我们的任务系统可以支持以下能力:
涉及埋点型任务,业务方可以优雅对接,不需要额外关心任务达成的判断,直接基于SDK透传埋点即可;
新任务可以快速支持配置,业务方一次接入,后续零成本开发;
基于用户标签、AB实验平台,支持任务实验配置能力,可快速验证任务上线效果。
上线周期大大缩短:原行为类任务从需求评审,到设计开发测试上线,再到生产环境灰度测试,完整的周期可由原来的1-3个月缩短至1-3人天。
2.3 阶段三:扩大行为采集源,丰富触达形式
(1)痛点分析
场景引入:
某天游戏侧反馈希望接入我们的任务,但场景是“给游戏付费用户发送积分奖励,同时要求付费指定类型的游戏,且奖励的积分值根据付费金额而定(不同的区间给予不同的奖励,不足1元按1元计算)”。
在剖析这个应用场景时,我们延展发现以下主要痛点:
行为采集源单一:非埋点行为类的任务不支持
触达形式单调:只支持简单的toast以及snackbar
为了解决以上痛点,我们做了多方面的技术调研。
(2)业务模型

从本质上业务模型并没有大的变化,依然是“收集行为、判定任务关联行为是否达成、任务的奖励发放、对用户的触达”,其实我们需要着重关注的是以下几点:
行为采集源的拓展
支持复杂行为计算
动态的规则配置
(3)数据采集层
在数据采集层上我们尽可能覆盖更多的数据源,包括埋点、数据库(MySQL)、消息队列、API/RPC接口等,以下为当前数据采集的数据流向图:

采集能力完善
集群管理:不同的业务方、不同的任务,相应产生的数据量级各不一样,为了防止单点导致业务数据处理不及时,我们在设计上可以支持为采集任务动态配置集群,提升消息处理及时性。
数据“源”管理:定义采集来源,可动态配置RocketMQ/Kafka消息,并支持动态创建监听器。
元数据管理:定义指定采集行为的基础信息,包括行为事件存储介质、事件类型、过期时间、集合名等等。
数据预处理:主要指数据过滤,通过对比排查,我们最终选择aviator的表达式引擎进行过滤处理。
数据归一:业务方采集的源数据定义格式各一,为了数据计算层的统一,我们会将元数据进行“格式化”,便于后续统一处理。
数据存储:源事件存储,在存储介质选择上我们有多维度的考量,数据量大、能够满足聚合计算、方便清理,最初我们选择了ES,但通过性能测试对比,ES在聚合计算时性能有明显的差距,最终我们选择了MongoDB以及TiDB。
数据归一配置示例:

(4)规则计算层

事件的采集与计算层,我们在设计上将其独立开,采集层通过分布式消息将事件上报到计算层,经过计算最终将结果行为异步通知到任务层。
规则配置示例:

(5)表达式引擎
再回到最初的业务场景需要“要求付费指定类型的游戏,且奖励的积分值根据付费金额而定(不同的区间给予不同的奖励,不足1元按1元计算)”,为了满足业务层灵活多变的逻辑需要,我们引入了表达式引擎,便于业务灵活动态调整。

从多个维度的技术调研,最终我们选择AviatorScript做为我们的表达式引擎。
AviatorScript是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢?
Aviator的设计目标是轻量级和高性能 ,相比于Groovy、JRuby的笨重,Aviator非常小,加上依赖包也才450K,不算依赖包的话只有70K;当然,Aviator的语法是受限的,它不是一门完整的语言,而只是语言的一小部分集合。
Aviator的实现思路与其他轻量级的求值器很不相同,其他求值器一般都是通过解释的方式运行,而Aviator则是直接将表达式编译成Java字节码,交给JVM去执行。
简单来说,Aviator的定位是介于Groovy这样的重量级脚本语言和IKExpression这样的轻量级表达式引擎之间。
表达式引擎使用示例
// 数据清洗过滤
originEvent.pay_status == 1 && string.contains("11,12,13,14,15,16,92,93,95", originEvent.product_type + "")
// 规则计算
let value = eventObject.value / 100;
let success = value >= 1;
return seq.map('success',success,'data',value);
(6)任务层

在应用层,用户直观感觉的任务层,主要包括以下逻辑:任务与行为的关联配置、任务的投放、任务的奖励发放、用户的触达、用户任务的状态。
(7)触达层
自定义弹窗:业务方可基于vivo建站平台自动创建丰富多彩的页面交互效果,异步事件任务可以基于push中转透传结果。
消息透传:任务结果可通过MQ消息异步传递至业务方端侧,可消费转入消息盒子,或用作其他逻辑。
触达交互示意图:

三、整体系统架构

四、服务稳定性
4.1 系统防护
服务降级:接入限流、熔断组件
集群隔离:按业务场景做服务单元隔离,避免高并业务场景影响整个服务
异步执行:非核心功能异步化(例如行为轨迹)、服务依赖方接口异步(例如请求业务方发放礼品)
4.2 服务拆分
大系统根据业务模块拆分,整个积分任务系统按业务职责主要拆分为如下几个系统:
事件采集服务(事件采集、过滤、映射、存储)
事件计算服务(事件计算、通知)
任务服务(任务判定达成、奖励触达)
4.3 服务监控
系统监控:完善的CPU、日志中心告警、DB主从延时、消息积压、慢服务等
数据监控:完成的行为事件链路监控,便于排查定位
五、写在最后
5.1 任务中心建设过程感想
系统设计上需要关注业务模型抽象的能力,避免一开始就留坑;
系统防护设计,常规套路:限流、熔断、降级、基于CAP理论执行;
使用发展的眼光看待系统建设,系统的设计需要经过反复的迭代,不断完善,“稍稍跑在业务前面的技术架构”可能是最理想的。
5.2 未来构思
打造平台扩展能力:将任务能力封装完善,能够拓展对上层业务提供复用能力。
奖励平台能力建设:当前任务发放的奖励主要形式为vivo积分,后续可进一步扩展,接入全品类的奖励类型。
组合时序行为事件:当前业务上只支持单行为事件的采集,还不支持行为有前后依赖关系,或者多个行为事件共同达成后完成任务。
实时计算能力提升:当前设计可能存在实时性波动的风险,例如MQ消息消耗阻塞、数据库binlog监听延迟,对实时性要求高的场景不友好。
附:
关于用户行为数据采集的私密性:很多人普遍认为SDK采集数据会涉及个人隐私,这主要还是不了解SDK数据采集的技术原理。
SDK:Software Development Kit,直译过来就是软件开发包,用N行软件代码采集数据。SDK采集的任何数据都来自用户的主观行为,企业在正常商业活动中获取的个人隐私数据并不违反法规,而我们积分的任务其实是用户有意主动去完成行为而获得一定的收益,同时我们也通过隐私声明明确告知用户且获得用户同意。
vivo积分任务体系的架构演进-平台产品系列05的更多相关文章
- vivo 手机云服务建设之路-平台产品系列04
作者:vivo 互联网平台产品研发团队 - He Zhichuang.Han Lei 手机云服务目前作为每家手机厂商必备的一项基础服务,其服务能力和服务质量对用户来说可以说是非常重要.用户将自己大量的 ...
- vivo推送平台架构演进
本文根据Li Qingxin老师在"2021 vivo开发者大会"现场演讲内容整理而成.公众号回复[2021VDC]获取互联网技术分会场议题相关资料. 一.vivo推送平台介绍 1 ...
- 58同城高性能移动Push推送平台架构演进之路
本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...
- 转: 58同城高性能移动Push推送平台架构演进之路
转: http://geek.csdn.net/news/detail/58738 文/孙玄 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需 ...
- 电竞大数据平台 FunData 的系统架构演进
电竞大数据时代,数据对比赛的观赏性和专业性都起到了至关重要的作用.同样的,这也对电竞数据的丰富性与实时性提出了越来越高的要求. 电竞数据的丰富性从受众角度来看,可分为赛事.战队和玩家数据:从游戏角 ...
- QQ音乐PB级ClickHouse实时数据平台架构演进之路
导语 | OLAP(On-Line Analytical Processing),是数据仓库系统的主要应用形式,帮助分析人员多角度分析数据,挖掘数据价值.本文基于QQ音乐海量大数据实时分析场景,通过Q ...
- 聚光灯下的熊猫TV技术架构演进
2015年开始的百播大战,熊猫TV是其中比较特别的一员. 说熊猫TV是含着金钥匙出生的公子哥不为过.还未上线,就频频曝光,科技号,微博稿,站上风口浪尖.内测期间更是有不少淘宝店高价倒卖邀请码,光内测时 ...
- 微信Android客户端架构演进之路
这是一个典型的Android应用在从小到大的成长过程中的“踩坑”与“填坑”的历史.互联网的变化速度如此之快,1年的时间里,可以发生翻天覆地的变化.今天在这里,重新和大家回顾微信客户端架构的演进过程,以 ...
- 转:微信Android客户端架构演进之路
转自: http://www.infoq.com/cn/articles/wechat-android-app-architecture 微信Android客户端架构演进之路 作者 赵原 发布于 20 ...
- 【TEGer 在全球架构师峰会】 : 腾讯海外计费系统架构演进
欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者简介:abllen,2008年加入腾讯,一直专注于腾讯计费平台建设,主导参与了腾讯充值中心.计费开放平台.统一计费米大师等项目,见证了米大师 ...
随机推荐
- 在VMWare里安装Win11虚机
1. 安装win11有最低硬件要求 64位CPU双核,内存4G,硬盘64G,受信任的平台模块(TPM)2.0,支持UEFI安全启动 2. VMware新建虚机的设置 1)创建64位虚拟机,CPU设置为 ...
- Kong网关安装自定义插件
安装自定义插件需要注意kong网关的版本要求!! 下面以安装Skywalking插件为例,要求Kong网关是2.2及以上版本,https://github.com/apache/skywalking- ...
- DVWA-Command Injection(命令执行)
命令执行漏洞,顾名思义,服务端在进行一些网站的操作.管理的时候,需要调用系统命令,如果对传入的命令参数没有进行一些过滤,可以直接执行服务器系统的命令终端 LOW 审计源码 <?php // 判断 ...
- Linux & 标准C语言学习 <DAY8_2>
一.函数 Function 一段具有某一项功能的代码集合,是C语言管理代码的最小单位 把代码封装成一个个函数,方便管理和调用函数 1.函数分类 标准库函数: ...
- [ARC152D] Halftree题解
很好的一道题,即使是我这种菜鸡也感到心潮澎湃. 直觉有余,证明不足.思路有余,推导不足. 无论是什么比赛,对拍都是最有效的查错方式. 本篇题解里的所有图片采用 graph_editor 制作. 题意简 ...
- 全网最详细中英文ChatGPT-GPT-4示例文档-信息智能提取从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)
目录 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node.js接口请求示 ...
- HTTP.sys漏洞的检测和修复(附补丁包下载)
关于这个 HTTP.sys 漏洞,查了一些资料,没有一个写的比较全的,下面我来整理下. 这个漏洞主要存在Windows+IIS的环境下,任何安装了微软IIS 6.0以上的Windows Server ...
- .NET Core MongoDB数据仓储和工作单元模式实操
前言 上一章节我们主要讲解了MongoDB数据仓储和工作单元模式的封装,这一章节主要讲的是MongoDB用户管理相关操作实操.如:获取所有用户信息.获取用户分页数据.通过用户ID获取对应用户信息.添加 ...
- xtrabackup: error: xb_load_tablespaces() failed with error code 57
问题描述:在数据库上运行xtrabackup备份脚本出现的一些报错 DB_version:mysql8.0.26 Xtrabackup:percona-xtrabackup-8.0.27-19-Lin ...
- VMware Workstation Pro许可证
永久许可证:ZC10K-8EF57-084QZ-VXYXE-ZF2XF 备用许可证: UF71K-2TW5J-M88QZ-8WMNT-WKUY4 AZ7MK-44Y1J-H819Z-WMYNC-N7A ...