优惠券系统思考

article/2025/10/29 0:39:45

一 序:

    有个老的优惠券系统业务侧要接手重构,听了下评审,还是觉得有些着急,产品没有想好想要,就开始设计原型。好的需求文档:我觉得要分几部分:系统概述、名词术语定义,整体流程,分接口的流程。不只是花个页面原型的事。

   当然对于产品来说,可能有些难。但是对于开发,一定要想明白,不要着急开工。出问题了在改。网上看了篇文章,觉得很高,第二部分主要是转载此文。原文地址:https://segmentfault.com/a/1190000005784383

二 原文:

每次打完滴滴, 我们都可以分享领券页面到朋友圈, 让大家一起来领券. 而领完券后, 一大堆5折券到账的感觉一定很爽(可惜现在的折扣越来越少了). 想必大家都对滴滴的优惠券影响深刻. 滴滴的用户规模如此之大, 送券力度如此之高, 如果由我们来做,该如何构架这样一个稳定且有扩展性的系统呢?

可扩展的定义

我们这里主要考虑这两个方面的扩展:

  1. 业务扩展
    变更或新增业务逻辑时, 尽量对已有的核心模块影响最小,保证系统整体的稳定性.

  2. 性能扩展
    保证系统是可以水平扩展的, 从而具有应对更高的负载能力.

一个系统的稳定性,除了需要由健壮的代码来保证外, 架构上的拆分,也会有相当大的影响.
比如:我们将易变的模块(需求变化频繁)和稳定的模块糅合在一起部署的话, 易变模块的变化造成整个系统频繁的部署,就会对整个系统带来极大的风险.
所以扩展性在系统设计之初就需要着重考虑.

功能和性能需求:

抛开具体业务的架构都是耍流氓, 那我们先从功能和性能需求上对要做的优惠券系统有个整体上的认识, 来看看哪些需求是易变的,哪些需求是稳定的.

优惠券的生命周期

优惠券作为在线交易系统(电商,O2O)的一种重要营销手段, 每张优惠券的生命周期都由两个阶段组成:

  • 发券
    可以由运营创建一个优惠券活动, 让用户主动领券, 也可以由运营对指定范围内的用户批量发券.

  • 用券
    消费者收到优惠券后,在结算页从优惠券列表中选择优惠券并使用.

发券

优惠券活动管理

运营人员根据促销档期和财务计划, 制定优惠券活动的方案,包括:

  1. 发券方式: 用户主动领取还是被动接收

  2. 发券内容: 发券的种类, 发券数量, 是否多种券组合发放.

  3. 促销方式: 见下文

  4. 使用限制: 见下文

  5. 通知方式: 短信通知,邮件通知,app通知

优惠券发券

从瞬时单次发券的用户数量来看, 发券活动分为:

  1. 对单用户发券:
    用户大促抽奖领券,新用户注册领券,订单完成后返券以及对投诉用户补偿券时会采用这种领券活动.

    • 从功能上看,对单用户发券的玩法多种多样,属于易变的需求.

    • 从性能上看,单用户发券请求量较高,同时也非常强调券到账的及时性,在用户发出领券请求后,系统应当尽快将券送达账户.

  2. 对多用户发券:

    • 从功能上看,在补贴大战,提升交易额以及唤醒沉睡的老用户时会采用,一般会结合短信通知和邮件通知的方式来让用户知晓有券到账. 多用户发券的业务较为稳定,一般是运营人员通过后台选择特定范围内用户列表后触发.

    • 从性能上看,对多用户发券的请求量较小,但发券量比较大,可能一次发放上百万张券到用户,所以多用户发券更强调发券系统的稳定性.

用券

促销方式

从券的促销方式来看, 优惠券种类一般有:

  1. 立减: 
    优惠金额固定的优惠券, 比如滴滴的现金券.

  2. 折扣: 
    优惠金额跟订单金额成比例的优惠券, 比如滴滴的折扣券.

  3. 其他促销

不同的优惠券促销方式, 会对应不同的优惠金额计算逻辑.

使用限制

从用户使用角度看, 优惠券还会有多种使用限制:

  1. 限时间:
    优惠券的有效期

  2. 限平台
    比如设定一种券只能在微信h5平台上使用

  3. 限地域
    比如只能在上海使用该优惠券

  4. 其他限制

限制逻辑保证了优惠券促销花的钱,都用到了提升对应维度的运营数据上.

需求总结:

  • 易变的需求:

    • 对单用户发券的方式(请求量大)

  • 稳定的需求:

    • 发券活动管理(请求量小)

    • 对多用户发券的方式(请求量小)

    • 优惠券的促销方式

    • 优惠券的使用限制

架构实现

整体架构

根据功能与性能需求,我们对优惠券系统模块做以下划分:

  • 优惠券发券平台
    发券系统作为核心系统,需要应对极大的访问量. 服务需要水平扩展,必须使其成为无状态, 因此服务的状态数据存储在Redis中.发券系统提供以下API:

    • 活动管理API

    • 批量发券API

    • 单用户发券API
      将单用户发券API和批量发券API拆分是因为两个接口的使用场景不太一样:批量发券的发券量非常大,但时效性要求不高, 可以做更多的优化.

    • 查询优惠券API
      提供查询所有优惠券和查询计算页可用优惠券的功能

    • 用券API

  • 优惠券活动平台
    提供运营人员管理优惠后台, 给用户抽奖领券的功能.其子模块属于易变的模块, 所以用子系统单独部署的方式对系统整体稳定性更高.子系统包括:

    • 活动管理

    • 批量发放后台

    • 领券子系统(抽奖)

    • 领券子系统(注册返券)

    • 领券子系统(订单返券)

  • 优惠券数据统计平台
    通过读取线上优惠券数据的备份,进行数据报表生成的平台, 提供运营数据分析是使用, 后续不再做介绍.

领券子系统都依赖于优惠券发券平台单用户发券接口,属于优惠券上层业务子系统. 将上层业务子系统跟发券核心系统分离,可以在保证发券系统稳定性的前提下, 通过提供单用户发券API, 来更灵活的实现多种发券活动业务,比如我们可以轻松的构建一个领券子系统: 兑换码, 来实现用户线下扫码兑换优惠券的功能.

技术实现

使用券池预生成优惠券

如何保证优惠券不超发?

运营人员创建优惠券活动时, 会设定本次活动可发优惠券数量.对于用户主动领券的活动,当该活动的优惠券被领完后,用户无法再次领取改活动的优惠券. 要保证优惠券不超发,有两种方案:

  1. 通过全局计数器的方式,保证并发下发券的数量变更的原子性.

  2. 通过先预生成优惠券存放到队列来实现.用户领券时从队列pop取出优惠券,再和用户进行绑定完成发券操作.当队列pop不到优惠券时,就代表优惠券发完了.

如何解决优惠券唯一码的生成问题?

优惠券会有一个根据指定规则生成的全局唯一码作为交换ID, 在优惠券各个子系统中传递.比如:
XXYYZZ-20171016-001234567
XXYYZZ前缀代表业务码
中间20171016为时间
后缀001234567代表当前码的生成数量

如果我们在用户主动领券时才生成唯一码, 会存在多节点,多线程并发的问题,导致序号重复生成.一般需要加锁处理,会降低系统的性能.解决这个问题,我们可以使用预生成的方式,在单节点单线程中生成唯一码,再存入Redis队列中提供后续pop使用,从而避免加锁带来的性能下降.

结合以上两个问题, 我们采用Redis队列作为存放预生成的优惠券的券池.可以极大的提升系统的性能和稳定性.

如何应对大量的发券的请求

当优惠券活动开始时, 用户的领券操作会修改数据.当用户在结算页使用优惠券时,查询完优惠券后,会马上使用优惠券. 所以整个流程优惠券数据的读写比操作接近1:1. 
常规的缓存策略为:

  • 用户的所有优惠券为读缓存

  • 在优惠券被写入时, 失效用户的所有优惠券缓存.

  • 当用户优惠券缓存不存在时重新从数据库加载所有缓存.

这种缓存策略虽然简单,但实际应用中缓存命中率非常低.因为大多数场景都是用户领完券后立即使用.

另外用户的发券操作会涉及到写数据库,大量的写请求会造成数据库的瓶颈. 要提高系统性能.就必须使用写缓存, 即:

  • 当用户写入优惠券时,先不写入数据库,直接写入集中式缓存Redis,

  • 所有查询操作都直接从Redis中查询.

  • Redis中的新数据通过指定数量的线程, 源源不断的同步到数据库.

整个过程如图所示:

 三 思考:

   我觉得上面的文章已经吧系统的主要的点讲到了,而且层次清晰,设计合理。

一些点:

1 数据要闭环,也就是为什么要有数据统计,毕竟是跟营销关联的系统。开始要有预算,多少经费,发多少钱,绑定的情况如何,最终使用的情况如何。以后要有数据分析做支持,不能只靠拍脑袋。也为以后的活动做决策参考。有人会说,pm催得紧一期没时间做,也也想好了系统改怎么划分,数据源啥的准备好,可以先不要页面图表展示,数据要有。

2. 批量推送:不管是BI筛选出来老用户挽留,还是运营导入的Excel要做批量用户的发券,给用户绑定可以是后台,推送消息或者是短信需要考虑好时间,不能半夜跑数据的时候影响用户。这里异步的批量怎么设计也是有优化空间。

3. 至于新老客判断这种,是要依赖用户crm系统的。积分兑换券也是类似,都要放到营销模块而不是底层的券系统。

4.券数据毕竟从业务量考虑:数据量随着活动进行而进行,已过期或者已使用的券数据还是要定时归档的,不然表里很多历史数据,表膨胀的厉害。

5. 促销规则、限制规则如何剥离抽象,需要考虑,尽量不依赖db做复杂查询。

6. 券有效期到期提醒:大数据量情况,不推荐扫描用户券绑定关系表。暴力扫表数据量小可以,大数据量需要提前考虑其他优化方式。

做好一个系统不容易,先考虑好了再动手。不然以后一定是坑,跟着需求变,系统扛不住了。。


http://chatgpt.dhexx.cn/article/kUTDLuji.shtml

相关文章

vivo 亿级优惠券系统架构设计与实践

作者:vivo互联网开发团队-Yan Chao 一、业务背景 优惠券是电商常见的营销手段,具有灵活的特点,既可以作为促销活动的载体,也是重要的引流入口。优惠券系统是vivo商城营销模块中一个重要组成部分,早在15年vivo商城还是单…

谈谈优惠券系统的设计

优惠券系统的核心在于各种券种的管理,发放和使用。 通常的设计角度是从终端用户出发,所谓“所见即所得”,终端用户所见到的形形色色的优惠券,正是开发整个系统的挑战所在。 可以想象,为了配合不同形式的线上、线下活…

优惠券系统开发设计

目录 什么是优惠券系统 优惠券业务诉求 优惠券数据模型 什么是优惠券系统 优惠券系统是一种营销策略,通过发放优惠券来吸引顾客购买商品或服务。优惠券可以是折扣券、满减券、赠品券等形式,顾客在购买商品或服务时可以使用优惠券获得相应的优惠。优惠…

促销#卡券系统基本设计

整理卡券系统的分析设计,越发感悟到技术的存在是为业务服务的这句话,在这之前收集并认真学习了多个电商平台的卡券系统或功能,卡券系统是上层促销策略与底层促成交易生成有效订单的连接点,运营方面的各项策略最终是必须依托有效的…

如何设计一个优惠券系统

背景 部门为一个租房房源平台,为各个商家提供房源发布&C端曝光获客的功能,现在要构建一个优惠券系统,用于各个节假日节点进行商家营销活动。形式主要以商家在B端参与活动,对房源绑定优惠券,将租赁价格进行优惠&am…

大厂的优惠券系统是如何设计的?

1 Scenario 场景 电商系统的促销手段(Electronic Commerce Systems): 优惠券拼团砍价老带新 优惠券的种类 满减券直减券折扣券 优惠券系统的核心流程 发券 **发券的方式:**同步发送 or 异步发送 领券 谁能领? …

优惠券系统架构设计与实践

技术琐话 2022-01-20 12:03 以下文章来源于vivo互联网技术 ,作者Yan Chao vivo互联网技术. 分享 vivo 互联网技术干货与沙龙活动,推荐最新行业动态与热门会议。 一、业务背景 优惠券是电商常见的营销手段,具有灵活的特点,既可以…

python3.5 将py文件转换成EXE文件

方法其实就是利用pyinstaller和pywin32 1.安装pyinstaller 输入cmd进入windows命令提示符,如果没有设置python环境变量,则转到python安装目录的scripts目录下, 如果已经设置python环境变量,可以跳过上述步骤。然后输入 pip inst…

把python文件转exe文件 和 打包报错处理

今天,我教大家怎么把py文件转换成exe文件, 首先,我们要用到一个第三方库,他就是pyinstaller pip install pyinstaller zip包下载(CSDN)免费 Pyinstaller代码压缩包-Python文档类资源-CSDN下载 此外&am…

python封装成exe

最近写了一个小小的程序,需要进行封装exe,为了简单,就直接用了pyinstaller这个模块,对于python3.6版本的童鞋来说,简直方便的不要。下面就给大家介绍一下如何用pyinstaller去封装程序为exe程序。 首先,需要…

python如何封装成exe

python文件封装成exe 第一种:.py文件直接封装成exe第二种:整个项目封装成exe ) 第一种:.py文件直接封装成exe 1.cmd进入py文件所在的目录 备注:在py文件所在的目录下,按住shift鼠标右击,然后找到“在此处…

Python打包成exe文件_详细操作

Python打包成exe文件 前言一、安装pyinstaller1.1 安装pyinstaller,使用安装命令:1.2 如果遇到需要更新版本请输入:1.3 检查是否正确安装1.4 稍等,水一下; 二、python打包成exe文件(附带图标打包)2.1 第一种…

将Python文件转化为exe文件

第一步:首先安装相关工具 在Windos中打开命令行窗口 输入pip install pyinstaller 出现以下情况表示安装成功 第二步:打包成exe文件 若需将xxx.py文件打包,只需在终端执行: 注:终端需切换至xxx.py文件所在目录下。…

如何将python的.py文件转换为可执行的.exe文件。

首先,我写了一个print(“hello,world”).py文件。命名为hello.py保存在我的电脑C盘的C:\Users\ly目录下如图所示。 ps:尽量选择在这个文件夹下,如果选择其他盘的文件夹下,生成的.exe的dist文件夹也会出现在…

将.py文件转化为.exe文件

将.py文件转化为.exe文件首先需要第三方库 pyinstaller 1.如果没有安装pyinstaller,则在命令提示符输入 pip installer pyinstaller 如果已安装,则会显示 表示这几个都安装好了。 2.下载安装pyinstaler运行时所需windows扩展:pywin32 mham…

[272]如何把Python脚本导出为exe程序

文章目录 一.pyinstaller简介二.pyinstaller在windows下的安装三.打包四.小实例(windows下)附加 一.pyinstaller简介 pyinstaller将Python脚本打包成可执行程序,使在没有Python环境的机器上运行 最新版是pyinstaller 3.1.1。支持python2.7和…

把py转化成exe(干货)

问题提出: 无奈别人的电脑没有装python编译环境,无法运行py文件。   本教程为在window环境下,使用PyInstaller3.4将Python脚本打包成exe可执行程序。 使用命令: pip install pyinstaller   上图为成功安装效果图&#xff0…

简单3步将你的python转成exe格式

使用pyinstaller可以将你的.py文件直接转换成.exe格式,在没有部署python环境的windows机器上直接运行你的程序!! 废话不多说,直接上正文。 1. 在命令行用pip安装 pyinstaller包 pip install pyinstaller 2.下载安装pyinstaler…

.py文件转为.exe文件的方法

写完一个Python程序想给朋友看?朋友电脑里没Python运行不了? 别急,这篇文章来帮你。 把你的python文件转成exe文件,打开方便,瞬间提示一个档次。 (我个人也遇到过这样的问题,看了别人的博客解…

将Python程序打包成exe文件

我新写了一篇更加完整的文章,与这篇文章相比,它新增了两种打包方式:多python文件打包和含有资源文件的打包方式,具体请戳链接: 用 Pyinstaller 模块将 Python 程序打包成 exe 文件(全网最全面最详细&#x…