写点什么

电商秒杀系统

作者:胡颖
  • 2021 年 12 月 18 日
  • 本文字数:1346 字

    阅读完需:约 4 分钟

项目要求

•     电商秒杀系统

•     架构实战营毕业设计

•     项目要求

•     业务背景

•      你们挑选选品各大电商平台上畅销和好评的商品进行销售,每个品类不超过 20 个商品,目前做了 10 个品类;

•      本次 6.18 秒杀选择了 1000 个充电宝,10 台 iPhone 12 作为秒杀商品;

•      正常的日活大约 100 万用户;

•      老板要求万无一失。

•     技术背景

•      技术团队以 Java 为主,已经落地了微服务架构;

•      主要渠道是自有的 App(包括 iOS 和 Android)和微信小程序,为了促进用户转化为 App 用户,只有下载 App 才能参加秒杀活动;

•      目前只有单机房。


主要服务及流程

•     服务

•      秒杀商品选择

•      秒杀活动建立和配置

•      秒杀 App 客户端

•      购买

•      下单

•      付款

•     流程

•      用户准备好,商品描述信息已经在 app 上。用户点击,如果还没抢完,用户创建订单,系统锁定库存,用户付款,系统扣减库存,用户购买成功。


吞吐量估算

•     日活用户 100 万。

•     假设都参加秒杀,并且秒杀集中在 1 分钟内完成,为了防止用户过度刷屏,每个账号最多每 5 秒访问一次,这样 QPS 是 1000000*60/5/60=200K/sec.


主要数据库表单

•     商品信息表:id,名称,描述,价格

•     库存表:id,商品 id, 秒杀活动 id,库存,锁定(锁定用于表示已经下单,但还没付款,这样付款可以比下单有短暂滞后,提高用户体验,提高秒杀活动时间内下单速度)。

•     秒杀活动表:id,秒杀名称,商品 id,价格,数量。

•     订单信息表:id,商品 id,秒杀活动 id,用户 id,是否付款。


总体架构(不考虑加机房和 CDN)



秒杀操作

•       QPS 为 200k/s。 所以要引入缓存,可以用 Redis。

•       用缓存时就要考虑数据一致性问题。每次用户下单时先在 redis 减一(一个用户最多只能购买一个)。为了同步 Redis 和数据库的减库存操作可以用 Lua 脚本。秒杀活动商品数只有 1000 台左右,所以对数据库的减库存只有一千次左右,一般数据库是没问题的。

•       在秒杀开始前要进行缓存预热。

•       一台 RedisQPS 可达 100K/s,为了保险起见,可用 10 台 Redis。

•       因为秒杀活动时间短,不需要考虑停电及各种自然灾害问题。只要缓存能保护住数据库不被击穿就好。


限流和限购操作

•     要防止一个用户点击过多。一个用户每五秒才能访问一次。

•     要防止黄牛购买过多。一个用户最多购买一件商品。

•     以上操作均可通过 Redis 执行。不需要访问数据库。

•     Redis 要按用户 id 来 sharding.


订单服务

•       用户在通过秒杀 Redis 获取购买权后可以下单。此时下单也要让 Redis 和秒杀活动商品表及库存表同步。

•       此时库存数据库可以更新锁定商品数,单用户还没付款,所以还不能减库存。



付款服务

•     下单服务和付款服务之间可以用消息队列解耦。

•     付款后秒杀服务通知库存服务减库存,并修该锁定库存数。


综述    

•     最重要的是通过 Redis 来保证系统能经受住瞬间高峰。

•     利用 Redis 的 Lua 来保证和数据库同步。

•     因为秒杀活动时间短,不需要过多考虑自然灾害。

 

用户头像

胡颖

关注

还未添加个人签名 2019.01.06 加入

还未添加个人简介

评论

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