栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

秒杀场景设计方案

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

秒杀场景设计方案

秒杀场景设计方案

一、秒杀设计要面对的难点

秒杀特点:短时间内,大量用户涌入,集中读和写有限的库存。

  • 保证超高的流量和并发下系统的稳定性,保证不被打崩
  • 保证数据最终一致性, 不能超卖

解决方案:层层拦截,将请求尽量拦截在系统上游,避免将锁冲落到数据库上

二、架构设计

2.1、流量过滤

实际大促的时候,参与秒杀的用户很多,但是商品的数量是有限的,真正能抢到的用户并不多,那么第一步就是要过滤掉大部分无效的流量。

  1. 客户端优化
    1. 置灰前端按钮防止活动未开始无效的点击流量
    2. 前端设置验证码(不过不要像以前的12306那样复杂就行)
  2. 站点层面的请求拦截(nginx层)
    1. 非法请求校验,绕过上面限制的请求(比如抢票的插件)
    2. 黑名单、IP地址
    3. 用户ID参与活动次数,对请求计数和去重
  3. 服务层业务校验
    1. 参与的客户是否符号参加条件,白名单等
    2. 限流,滑动窗口、令牌桶等限流算法
    3. 写请求放到队列中,每次有限的写请求到数据层,如果成功了再放下一批,直到库存不够

2.2、性能优化

  1. 静态页面nginx 动静分离 或者 静态页面缓存到CDN
  2. nginx+redis 多级缓存
  3. 活动预热,库存提前加载到redis
  4. 独立部署,可以降级一些非核心业务,或者无用的业务带代码

2.3、避免超卖

保证数据最终一致性, 不能超卖。

解决方案:

  1. 首先查询redis缓存库存是否充足
  2. 先扣库存再落订单数据,可以防止订单生成了没有库存的超卖问题
  3. 扣库存的时候先扣数据库库存,再扣减redis库存,保证在同一个事务里。

这种方案中当大量请求落在同一条库存记录上去做update时,行锁导致大量的锁竞争会使得数据库的性能急剧下降,性能无法满足要求。

所以演进的方案就是排队,写请求放到队列中,每次有限的写请求到数据层,如果成功了再放下一批,直到库存不够, 串行化去扣减库存,可以一定程度上缓解数据库的并发压力。

三、总结

尽量将请求拦截在系统上游(越上游越好)。
读多写少的多使用缓存(缓存抗读压力)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866466.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号