毕业设计 - 电商秒杀项目
【业务背景】
你作为一个电商创业公司的架构师,负责设计 6.18 大促秒杀系统的设计,你们的业务模式如下:1. 你们挑选选品各大电商平台上畅销和好评的商品进行销售,每个品类不超过 20 个商品,目前做了 10 个品类;
2. 本次 6.18 秒杀选择了 1000 个充电宝,10 台 iPhone12 作为秒杀商品;3. 正常的日活大约 100 万用户;4. 老板要求万无一失。
【技术背景】
1. 技术团队以 Java 为主,已经落地了微服务架构;2. 主要渠道是自有的 App(包括 iOS 和 Android)和微信小程序,为了促进用户转化为 App 用户,只有下载 App 才能参加秒杀活动;3. 目前只有单机房。
【毕设要求】
1. 设计完整的架构,例如存储、负载均衡、缓存、高可用、可扩展等;2. 大约 10 页以内的 PPT,每页 PPT 说明一项设计,包括架构设计和设计理由,无需详细解释备选方案。
【提示】
1. 分析考虑要全面,但并不意味着架构设计要面面俱到,如果分析后认为某些设计点可以不做,就在作业最后统一说明原因即可;2. 如果没有思路,请对照模块 9 的 IM 案例;3. 如果有的信息觉得不够全或者不够细,可以做出一定的假设,但不能天马行空,需要对照已有的业务背景和技术背景进行合理推断。
业务基本场景
每个用户只有登录,获取 Access Token 才能进行访问页面
浏览畅销和好评商品页
获取秒杀商品详情页
秒杀开始,下单预扣库存
支付订单完成下单
架构设计思路
百万用户的架构设计思路如下:
静态数据量不是很大,如用户数据,采用 mysql 存储
大量的查询请求是秒杀的核心性能挑战, 采用 redis cluster 来做秒杀商品的缓存
要求对秒杀商品的库存刚好卖光,不出现超卖,少买。 采用先下单预扣库存的方式,来避免超卖和少卖
采用三级负载 2 台 Nginx/LVS
拆分成 5 个微服务:登录,商品,秒杀,订单,支付
采用同城双中心来保证负载高可用
利用 Clickhouse / Pinot 来做大数据分析
存储设计
存储数据估算
【登录】UV = 100 万
【商品】20 * 10 品类 = 200
【商品库存】与商品数相同
【秒杀商品库存】1000 个充电宝 + 10 台 iphone = 1010
【订单】100 万* 10%(假设每天有 10%的用户下单)=10 万
【订单详情】10 万 * 5(假设每单平均包含 5 个商品)= 50 万
【支付】 ~订单数
存储架构
100 万用户数据,10 万订单数据,50 万订单详情数据,10 万支付单数据
秒杀商品数据,秒杀上平库存数据
计算设计
计算数据估算
【浏览商品】QPS: 100w * 10 / 3600s/ 24h = 115 qps
【秒杀商品】QPS: 100w*20%(假设 20%的活跃用户参加秒杀)*1s= 20w/s
业务流程
计算架构设计
负载均衡
缓存设计
APP 缓存: 提前缓存详情页和秒杀页的图片,HTML
CDN 缓存:保存秒杀页静态资源,就近获取,不用把静态资源流量打到自身服务器上
应用内缓存:存储预分配库存数据
分部署缓存:存储商品真实库存
微服务设计
秒杀服务
如果不做限流,需要支持 20w 的 QPS,假设每个节点承载 500 请求数,需要 20w/500 = 400 台,从成本上考量是无法接受的
如果采取限流措施,在网关对 IP 和 UserId 做限流,在应用内部利用令牌桶算法限制并发数在 500 一个节点,基于秒杀商品的数量 1010 个, 我们使用三个秒杀服务节点
高可用设计
版权声明: 本文为 InfoQ 作者【阿拉阿拉幽幽】的原创文章。
原文链接:【http://xie.infoq.cn/article/ef2f75c8c44d254d846deca4e】。文章转载请联系作者。
评论