怎么设计一个秒杀系统

  • Post author:
  • Post category:其他


1、系统部署

秒杀系统部署要单独区别开其他系统单独部署,这个系统的流量肯定很大,单独部署。数据库也要单独用一个部署的数据库或者集群,防止高并发导致整个网站不可用。

2、防止超卖

100个库存,1000个人买,要保证不会超卖

防止超卖要保证原子性,判断库存名额是否充足和减少库存扣减成功放到一个lua脚本里面

3、限流

防止机器一直点


IP限流:

IP限流的实现方法是根据请求IP地址来进行限制。具体做法是在服务器端记录每个IP地址的请求次数,当请求次数超过设定的阈值时,就拒绝该IP地址的请求。可以使用分布式缓存技术如Redis来记录每个IP的请求次数,并设置定时清除缓存的策略,以保证数据的准确性和实时性。


请求频率限制:

实现方法是根据一定时间内的请求次数来进行限制。具体做法是在服务器端记录每个用户请求的时间,并对请求进行计数,当请求次数超过设定的阈值时,就拒绝该用户的请求。可以使用令牌桶算法或者漏桶算法来实现请求频率限制,同时也可以使用分布式缓存技术如Redis来记录每个用户的请求时间和请求次数。

4、静态优化

很多用户在活动前会访问静态页面进行刷新,所以要静态分离开

URL唯一化处理,我们在进行静态化资源的时候,对页面静态资源进行提前缓存,保证用户直接接请求URL时候,无需解析请求头,无需重组HTTP协议,可以直接找到静态资源返回,不与后端做数据交互,一般静态资源我们放到CDN上,CDN就近原则可提高我们的响应速度和命中率,同时cdn开启资源压缩,减少传输数据量。

5、降级

降级就是系统容量达到一定程度时,限制或关闭系统的某些非核心功能,从而把资源保留给更核心的业务,例如秒杀下单后给用户增加积分,这个功能不是下单的核心功能,可以先记录一条信息,等后面流量下来后在调用积分系统给用户补上

6、按钮置灰

12点的秒杀,11点59用户猛点,猛发请求也会对服务器性能造成影响,所有我们的秒杀一定是在未达到时间点的时候,不让点,时间点一到,通过前端的定时器来将按钮变更。

7、预热

秒杀读多写少,访问商品人数往往大于购买人数,活动和库存都可以提前预热,数据提前放到redis中,并且redis搭建好集群部署防止缓存击穿。谁知好过期时间逻辑删除策略等

8、流量错峰、防刷

使用各种手段,将流量分担到更大宽裕的时间点,比如用验证码

9、异步下单

使用消息队列来完成异步下单,注意后台经过了校验、限流后流入的都是有效的,队列接收到消息之后异步生成订单,然后订单创建成功之后,入库没有问题的话,可以使用短信或其他方式告知用户秒杀成功,如果失败的话,我们可以引入一些补偿机制进行重试。

10、多级缓存

在传统的缓存架构下,tomcat成为了并发瓶颈

商品详情页是不会经常变动的,这些数据可以提前用多级缓存缓存到nginx本地缓存中,离用户最近的地方,就可以这样设计多级缓存架构来解决



版权声明:本文为weixin_54232666原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。