写点什么

设计电商秒杀系统

用户头像
tjudream
关注
发布于: 刚刚
设计电商秒杀系统

设计电商秒杀系统

【业务背景】

你作为一个电商创业公司的架构师,负责设计 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 --> 打开秒杀页面 --> 下单秒杀 --> 查看秒杀结果页面 --> 支付 --> 确认收货

  1. 下载并登录 APP 这一步,大部分用户会提前登录

  2. 用户大概率会频繁刷新秒杀页面,所以秒杀页面需要做成静态页面

  3. 下单秒杀按钮用户有可能会多次点击,需要考虑去重和幂等,在 APP 端可以做控制去重,但是后端也要做,防止技术用户突破 APP 端直接调用后端接口

  4. 查看结果页面包括秒杀中、秒杀成功和秒杀失败 3 种状态,大部分都是秒杀失败的,可以提前把这些页面缓存在 APP 端

  5. 支付页面是秒杀成功之后去支付的,秒杀成功的人数不多,所以支付压力不大

秒杀场景的主要压力是在用户点击秒杀按钮时产生的

架构总体思路

  1. 秒杀页面做成静态页面,提前缓存在 APP 中

  2. 因为是在 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


发布于: 刚刚阅读数: 2
用户头像

tjudream

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论

发布
暂无评论
设计电商秒杀系统