如何设计一个积分领取系统
积分作为一种营销手段,被广泛运用于线上/线下的产品中,以此来增加用户对于产品的粘性。比如天猫积分可以用来兑换商品,京豆可以在下单折扣等,如下图所示。
如今,随着获客成本的增加,如何减少用户的流失,变成了各个产品的核心命题之一。也正因如此,很多业务引入了各式各样的积分系统。为了更好的面对业务带来的变化,对整个积分兑换流程做一个合理的抽象是正确且有必要的。只是,整个积分的兑换是一个非常庞大且复杂的流程,因此,本着一切从简的理念,我们这期先聊一聊如何设计一个积分领取系统。
从具体到抽象
无论是天猫积分/京豆,都会有一个规则说明,笼统的来说,无外乎两个主要的功能点:如何获取积分以及如何消费积分。
获取京东的方式通常有:
每天签到一次,领5个京豆
买100元以上的东西,领20个京豆
发1条20字以上的评论,领10个京豆
……
从上面的规则中,我们可以看出,基本符合一个格式:xx行为,执行yy次,可以得到zz个ww。
于是我们可以将上述案例抽象成以下三步:
行为感知
任务推进
权益领取
架构设计
本着高内聚与低耦合的理念,我们可以抽象成几个核心模块
行为感知模块
该模块负责对用户的行为进行感知,如果用户的登录行为、点赞行为、下单行为等。通常情况,该模块是异步进行的。
原因也很简单,行为感知作为依附于主链路存在的功能,其存在不应该影响到主链路的运行。
例如“用户每日登录获取一个积分”这样的案例,我们不应该在登录接口同步进行行为感知。通常采取的做法是,开一个子线程调用一下行为感知接口即可。
但是,行为的种类千奇百怪,如何对行为进行一个合理的抽象便是我们要考虑的问题了。一个简易的流程图如下所示:
在上述流程里,行为感知模块可以感知多种数据源(消息),解析不同业务的消息数据后,为了转换成系统内部需要的行为对象,通常还需要有一步数据填充的过程,这一步需要我们和其他的服务进行联动的,在数据填充完成后,外部的行为才真正变成我们整个积分领取系统内部所需要行为对象,这一步可以可以再发出一个行为变更消息出去,以便和其他业务解耦(当然也可以提供一个接口)。
任务推进模块
我们将如何领取积分归到该模块中。
所谓任务推进,便是我们上述案例中提到的例如:下单20元的物品、点赞10条内容、登录1次这样的行为。在该模块中,我们需要维护一张用户行为记录表和一个任务规则表。
行为记录表负责维护用户每天的任务进度状态,例如点赞了多少条内容等信息。
任务规则表负责录入玩法规则,比如点赞10条内容可得一个积分这样的信息。该部分通常会由一个运营后台来承接。
一个简易的流程图如下
在上述流程中,任务的匹配与任务进度的更新是比较核心的部分。如何做好技术选型是比较重要的一点,我们将会在下一章详细介绍。
权益领取模块
出于高内聚低耦合的思想,我们可以将权益系统的职责设置的简单一些,只需要负责增加积分、减少积分,查询积分明细这几个工作。至于从什么渠道加积分、加多少积分,则将职责上移到任务推进模块中进行。
举个例子解释一下。比如,用户通过下订单赚取积分。订单系统通过异步发送消息或者同步调用接口的方式,告知行为感知模块订单交易成功,补全必要的信息后,发送给任务推进模块;任务推进模块根据拿到的订单信息,查询订单对应的积分兑换规则(兑换比例、有效期等),计算得到订单可兑换的积分数量,然后调用权益领取模块的接口给用户增加积分。
这一部分的流程比较简单,就不画图了。但是如何保证积分加的正确,如何保证不重复加或者不漏加则是该模块的难点。
小结一下
简单对上述三个模块进行一个小结。有了上述共识后,我们可以抽象出如下的功能图。
详细设计(数据表设计)
数据库和接口的设计非常重要,一旦设计好并投入使用之后,这两部分都不能轻易改动。
改动数据库表结构,需要涉及数据的迁移和适配。改动接口,需要推动接口的使用者作相应的代码修改。这两种情况,即便是微小的改动,执行起来都会非常麻烦。因此,我们在设计接口和数据库的时候,一定要多花点心思和时间,切不可过于随意。
相反,业务逻辑代码侧重内部实现,不涉及被外部依赖的接口,也不包含持久化的数据,所以对改动的容忍性更大。
在对上述流程进行了一个抽象之后,我们发现有两个非常重要的表:任务规则表和任务进度明细表。
数据字典设计
任务规则表
这张表的设计比较简单,只需要指明相应的活动规则即可,表结构如下。
字段 | 说明 |
---|---|
id | 活动ID |
name | 任务名称 |
description | 任务描述 |
type | 任务类型 |
userAction | 用户行为 |
num | 任务次数 |
rewardCount | 任务完成后的奖励数值 |
rewardType | 任务完成后的奖励类型 |
period | 单次任务的周期,本次需求仅支持天级别(DAY)的周期 |
threshold | 每个任务周期内能完成的次数上限 |
如何设计一个优惠卷系统 场景 优惠券的种类 优惠券系统的核心流程 发券 领券 用券 需求拆解 商家侧 用户侧 编码 Service 服务 服务结构设计 优惠券系统设计技术难点 Storage存储 表单 ... 面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确 ... 面试题 如何设计一个高并发系统? 原文链接:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/high- ... 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里都是说啥,有高并发就经验者优先. 如果你确实有真才实学,在互联网公司里干过高 ... 什么是一个多级缓存系统?它有什么用?我们又如何设计一个多级缓存系统? 图片来自 Pexels 所谓多级缓存系统,就是指在一个系统的不同的架构层级进行数据缓存,以提升访问效率. 我们都知道,一个缓存系统 ... 高并发面试 - 如何设计一个高并发系统? 面试题 如何设计一个高并发系统? 面试官心理分析 说实话,如果面试官问你这个题目,那么你必须要使出全身吃奶劲了.为啥?因为你没看到现在很多公司招聘的 JD 里 ... 一.为什么需要秒杀系统? 电商平台本质是在线上撮合买卖双方的购销需求,达成交易.虽然是线上交易,但也遵守朴素的经济学原理,供求关系决定了商品的经济活动.当供求平衡时,买方和卖方处于对等关系,双方相对稳 ... 1. 引言 设计复杂系统的能力是高阶工程师的必备能力,设计出完备.健壮.优雅.前瞻的系统是工程师的不懈追求.在上一篇文章中,笔者介绍了设计一个复杂系统的第一步:深入理解业务.本文作为<如何设计一 ... 本文来说下如何设计一个单点登录系统 文章目录 概述 JWT的组成 头部(Header) 载荷(Payload) 签名(签名) 签名的目的 信息会暴露 JWT的适用场景 用户认证八步走 和Session ...如何设计一个积分领取系统相关推荐
最新文章
热门文章