把优惠券系统设计的炉火纯青!(1)

简介: 把优惠券系统设计的炉火纯青!

作者:盐汽水

链接:https://juejin.cn/post/7116401645323288613

问题抛出

在近期的项目里面有一个功能是领取优惠券的功能,

问题描述:

每一个优惠券一共发行多少张,每个用户可以领取多少张:

如:A优惠券一共发行120张,每一个用户可以领取140张,当一个用户领取优惠券成功的时候,把领取的记录写入到另外一个表中(这张表我们暂且称为表B)

image.png

image.png

<!--减优惠券库存的SQL-->
<update id="reduceStock">
     update coupon set stock = stock - 1 where id = #{coupon_id}
</update>

上面的代码按照我们的逻辑是没有问题,我通过使用PostMan软件测试也是没有问题,但是上面的代码确实是有问题的。


往往我们写的一些业务功能,在低并发的时候很多的问题会体现不出来。所以这个领取优惠券的功能我通过Jmeter软件来进行压测。


image.png


这里配置了一下,大概会发送500次请求,那来验证下优惠券会不会出现超发的问题


image.png


执行结果,里面没有出现异常什么的,样本为500。包括在汇总报告里面也出现了一些返回信息是优惠券不足的信息,那来看下数据库里面的优惠券的总发行数量有没有变成负数呢?也就是有没有超发。


image.png


在测试的时候是测试的id为19的这条数据,测试完之后这里的总发行数量(stock)居然变成了-1(也就是超发了一张)。


问题引发

在解决这个问题之前,先来看下这个问题是如何引发出来的。


image.png


上面这张图是整个领取优惠券的流程(上图并没有使用流程图来画,我觉的这样画可能表达更清楚一些),在蓝色的框那里就是出现超扣减库存的时候。为啥这样说呢?


如果同时来了两个线程(你可以理解成是两个请求),比如先来的那个请求通过了检查(线程A),这时线程A还没有扣减库存,这时线程B经过一翻操作也通过了这个检查优惠券是否可领取的方法,然后线程A和线程B依次扣减库存或者是同时扣减库存,这样就会出现优惠券超领的情况。


image.png


清楚了问题引发的原因,那就来看看如何解决它们。


推荐一个开源免费的 Spring Boot 最全教程:


https://github.com/javastacks/spring-boot-best-practice



相关文章
|
缓存 算法 NoSQL
红包场景的系统设计和实践
红包场景的系统设计和实践
263 0
红包场景的系统设计和实践
|
4月前
|
数据格式
阿里商旅账单系统架构设计实践问题之系统设计中的清结算系统问题如何解决
阿里商旅账单系统架构设计实践问题之系统设计中的清结算系统问题如何解决
|
6月前
|
存储 传感器 数据中心
链动2+1商城互助系统开发|模式分析
技术架构也一样,有着最基本的组成要素。技术架构有三种元素,分别是功能元素、系统、架构。
|
存储 NoSQL 安全
红包系统架构设计
红包系统架构设计
1745 0
红包系统架构设计
|
缓存 算法 搜索推荐
618省心凑背后的新算法——个性化凑单商品打包购推荐
作为购物导购链路的一个重要环节,凑单旨在快速帮助用户找到达成某个满减门槛(比如满300减50)的商品,完成性价比最高的跨店组合结算。
751 0
618省心凑背后的新算法——个性化凑单商品打包购推荐
|
Java 应用服务中间件 数据库
电商促销后台设计,写得太好了!
电商促销后台设计,写得太好了!
304 0
电商促销后台设计,写得太好了!
|
存储 前端开发 JavaScript
字画/书画/画室抢拍/拍卖/竞拍商城系统开发案例成品/方案设计/逻辑项目/源码程序
  Dapp:代表去中心化应用程序。它们是在去中心化网络或区块链上运行后端代码(主要用Solidity编写的智能合约)的应用程序。可以使用React、Vue或Angular等前端框架构建Dapp。
|
SQL NoSQL Java
把优惠券系统设计的炉火纯青!(2)
公司新来一个同事,把优惠券系统设计的炉火纯青!
156 0
把优惠券系统设计的炉火纯青!(2)
|
存储 人工智能 安全
年年玩五福,五福质量保障怎么做?
阿里QA导读:集五福作为支付宝年度最大IP,怎么能够让用户丝滑地参与体验五福?下面从质量视角聊聊今年参与五福的一些想法,希望所说内容能对业界质量保障的同学有所启发和帮助。
275 0
年年玩五福,五福质量保障怎么做?
|
SQL 关系型数据库 MySQL
链动2+1系统开发玩法规则 | 链动2+1系统开发成品源码实例
“链动2+1”是一种促进企业和品牌迅速建立起获客团队、拓宽客源渠道、促进销售增长的一种新模式。 这是一种在传统的分销模式基础上的,并且合理合规,主要是为了激发员工的积极性,鼓励顾客带新客户,而顾客除了可以获得折扣外,还可以获得一定的提成和奖金。
下一篇
无影云桌面