架构实战营 - 毕业设计
设计电商秒杀系统
【业务背景】
你作为一个电商创业公司的架构师,负责设计 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. 如果有的信息觉得不够全或者不够细,可以做出一定的假设,但不能天马行空,需要对照已有的业务背景和技术背景进行合理推断。
存储采用 MySQL 集群+Redis Cluster
MySQL 集群沿用现有电商系统,保存最终秒杀的订单记录,数据量同商品数量
Redis Cluster 是秒杀系统的核心部分:
利用 Redis 的高效,秒杀开始前,商品库存预热保存在 Redis 里,减少库存的操作不经过 MySQL。
利用 Redis 的单线程处理的特点,采用漏桶限流算法,进行限流。
采用 Redis Cluster 来实现高可用。
原有电商系统只用 Nginx 作为网络接入负载,为了应对秒杀的高并发,新增 LVS 来做负载。
秒杀系统服务集群前同样配置 Nginx 作反向代理和负载均衡。
LVS 对接入流量作区分,如果是秒杀请求,走秒杀服务集群;如果是正常业务请求,走原有的服务集群。
在秒杀高并发时保证正常业务的进行。
只有在 App 上才能参与秒杀活动,App 有缓存
秒杀活动页面的静态资源可以预先放在 CDN 缓存上面
分布式缓存采用 Redis Cluster,保存秒杀商品库存。
秒杀服务模块对接 Kafka,秒杀成功下单不直接记录数据库,而是推送到 Kafka。后续由订单服务模块从 Kafka 拿消息,异步处理订单,保存数据库
秒杀处理流程:
秒杀请求进来 Nginx,Nginx 从 Redis 获取令牌(预先放下商品数量相同的令牌)
如果不能获取,返回秒杀终止
获取成功,请求进入秒杀服务
秒杀服务作校验后(风控),从 Redis 获取库存
如果获取库存不成功(商品秒杀完),返回秒杀失败
如果获取成功,下单,信息保存在 Kafka
订单服务异步从 Kafka 获取下单信息,正式下单,保存订单数据
秒杀成功客户后续支付订单,完成秒杀。
采用动态 URL 的方式防止通过机器人自动抢秒杀商品,利用缓存保存动态 URL 信息,并设置有效时间为 60s。
秒杀系统都需要全链路压测,以保证线上的可用。
秒杀系统接入运维平台,监控秒杀活动是的流量情况。
做好熔断机制,万一秒杀活动影响到正常业务处理,能暂停秒杀活动。
评论