08小节:用户兑换秒杀优惠券功能(一)
作者:程序员马丁
热门项目实战社群,收获国内众多知名公司面试青睐,近千名同学面试成功!助力你在校招或社招上拿个offer。
开发兑换/秒杀优惠券功能(一),元数据信息:
- 什么是牛券oneCoupon:https://t.zsxq.com/pAWgS
- 代码仓库:https://gitcode.net/nageoffer/onecoupon —— 申请项目权限参考上述牛券项目链接
- 章节难度:★★★☆☆ - 较难
- 视频地址:文档先行视频次之
©版权所有 - 拿个offer-开源&项目实战星球专属学习项目,依据《中华人民共和国著作权法实施条例》和《知识星球产权保护》,严禁未经本项目原作者明确书面授权擅自分享至 GitHub、Gitee 等任何开放平台。违者将面临法律追究。
内容摘要:本文介绍了优惠券兑换和秒杀业务的关键技术实现。首先,通过编程式事务保障了数据的正确性,同时整合了 Redis 和 RocketMQ 等组件行为。考虑到秒杀业务对高吞吐量的需求,我们在 v2 版本中对架构进行了优化,通过 Canal Binlog 监听机制解决了这一问题,大幅提升了系统吞吐量并减少了异常发生的概率。
课程目录如下所示:
- 业务背景
- Git 分支
- 秒杀业务难点
- 优惠券秒杀前置拦截
- 优惠券保存数据库
- 重构优惠券秒杀方案
- Redis 缓存序列化器
- 执行优惠券兑换
- 文末总结
业务背景
通过之前的章节,我们已经把优惠券相关的业务铺垫的差不多了,接下来我们正式开启引擎服务的优惠券兑换/秒杀业务。
普通兑换自然没有那么多弯弯绕绕,但是涉及到一些比较大额或者有吸引力的优惠券来说,就不一样了,会面临大量用户抢购少量的库存,也就是我们常说的秒杀架构。和常规的秒杀系统一样,我们也是采用了缓存抗并发、然后扣减缓存成功的请求可以进行扣减数据库,并将优惠券添加到用户的领券记录中。
有一点需要和大家先说明下,因为优惠券的领取不像 12306 一样需要保障强一致性,所以,理论上可以从技术方案上做减法,会有一些容忍故障。
再和大家多扯一句,那就是面试可以造火箭,但是你得知道复杂技术方案 带来的落地难度问题。有时候针对没那么重要的场景,方案简单粗暴一点并没有问题。很多同学会说缓存宕机了怎么办?缓存主从异步同步丢失数据怎么办?缓存扣减成功数据库没扣减时应用宕机了怎么办?诸如此类,只是一张优惠券而已,其实没有啥问题。
虽然我们是这么说,但还是会以较严谨的方式给大家讲解牛券的秒杀架构。
Git 分支
20240908_dev_acquire-coupon_seckill_ding.ma
秒杀业务难点
在我们兑换/秒杀优惠券模板的接口中,可能会存在以下三个难点:
- 高并发流量压力:秒杀活动往往会瞬间吸引大量用户访问系统,导致流量骤增,如果直接访问数据库,可能会让数据库负载过重,甚至导致宕机。
- 库存超卖问题:由于并发请求,多个用户同时抢购可能会导致系统超卖,即多个用户同时购买到同一库存。
- 用户超领问题:优惠券中会有一个限制,每个用户限流几张,应该如何避免用户领取超过这个限制。
在接下来的讲解中,我们会逐一完成这些难点说明和解决方案讲解。