设计电商秒杀系统
设计电商秒杀系统
【业务背景】
你作为一个电商创业公司的架构师,负责设计 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. 如果有的信息觉得不够全或者不够细,可以做出一定的假设,但不能天马行空,需要对照已有的业务背景和技术背景进行合理推断。
基本业务场景
下载并登录 APP --> 打开秒杀页面 --> 下单秒杀 --> 查看秒杀结果页面 --> 支付 --> 确认收货
下载并登录 APP 这一步,大部分用户会提前登录
用户大概率会频繁刷新秒杀页面,所以秒杀页面需要做成静态页面
下单秒杀按钮用户有可能会多次点击,需要考虑去重和幂等,在 APP 端可以做控制去重,但是后端也要做,防止技术用户突破 APP 端直接调用后端接口
查看结果页面包括秒杀中、秒杀成功和秒杀失败 3 种状态,大部分都是秒杀失败的,可以提前把这些页面缓存在 APP 端
支付页面是秒杀成功之后去支付的,秒杀成功的人数不多,所以支付压力不大
秒杀场景的主要压力是在用户点击秒杀按钮时产生的
架构总体思路
秒杀页面做成静态页面,提前缓存在 APP 中
因为是在 APP 端进行的秒杀,我们有很强的控制权,所以可以在 APP 端就直接按照一定概率刷掉一部分用户,减小后端的压力
存储性能估算
订单量:1000 个充电宝+10 个 iphone,总的订单量为 1010 个
存储容量要求不大
存储架构设计
确保数据不丢失,采用 MySQL 主备
计算性能估算
日活用户 100 万,不一定都能参加秒杀,但是秒杀具有一定的吸引力,假设有一部分用户会吸引一部分亲友参加,综合考虑,假设最少 30%*100 万=30 万人参加秒杀,最多 1.5 倍*100 万=150 万人参加秒杀。
参加人数在 [30 万,150 万]。
最终抢到充电宝的只有 1000 个人,抢到 iphone 的只有 10 个人。
假设抢充电宝和抢 iphone 不在同一个时间,所有用户都可以参与,也就是分别计算即可。
由于都是在 APP 端进行秒杀,所有可以在 APP 端进行控制,只放 1% 的流量到后端,及在手机终端根据手机 id、手机型号等生成一个随机数对 100 的余数为 1 的才真正发请求到后端,其他的直接显示秒杀失败。
则最终进入后端的用户数为 [3000,15000]
峰值 TPS : 3000~15000
查询结果:只有请求后端的才需要查询结果,其他的直接在 APP 端控制直接显示提前在 APP 端缓存好的没有秒杀到的页面即可。
所以峰值 QPS : 3000~15000
计算架构之负载均衡设计
负载均衡使用 2 个 nginx,采用 keepalived 作高可用
请求进入后端后,后端服务直接将请求转换为消息,放入消息队列中。
然后有一个消费线程单独消费消息队列的消息,因此每台服务器处理请求速度会比较快,假设为 20ms,单台服务器 4 线程,则单服务器能抗 TPS 为 1000/20 * 4= 200
要处理 15000 的 TPS 需要 15000/200 = 75 台,预留一部分余量,100 台
消息队列采用 RocketMQ 的双 master 双 slave 方式部署
Nginx --> 应用服务器 --> RocketMQ --> 消费服务 --> MySQL
计算架构之缓存架构设计
缓存架构主要应对查询页
APP 内缓存 --> 应用服务器 --> Redis Cluster 缓存 --> 数据库
可扩展架构设计
无
高可用架构设计
MySQL 采用主备防止数据丢失
RocketMQ 主从,防止数据丢失
RocketMQ 的磁盘采用 RAID10
版权声明: 本文为 InfoQ 作者【tjudream】的原创文章。
原文链接:【http://xie.infoq.cn/article/9455b2dbdd8b17b333debaf5e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论