浅谈秒杀系统设计思路

秒杀场景

例如双11、618

涉及问题

  1. 高并发:时间短,瞬间用户量
  2. 超卖:卖出量多于库存
  3. 数据库超负荷:数据库甚至其他业务挂掉,导致404

设计思路

1.微服务

服务单一职责,以微服务的设计思想设计系统,每个服务职责、功能单一,并采取分布式的部署方式。每个服务建立单独的数据库。

2.缓存

  • 读请求:秒杀的典型的读多写少的业务,可以利用缓存分担数据库压力
  • 写请求:将数据库的库存数据转移到Redis缓存中,所有减库存的操作在Redis中进行,再通过后台进程把redis中的用户秒杀请求同步到数据库中。
  • Redis集群:主从复制、读写分离、哨兵监控
  • 防止超卖:利用Lua脚本(类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作)。把判断库存和扣减库存的操作都写在脚本中,使得库存为0后都return false

3.流量削峰

将请求放进消息队列,然后一点点的消费去修改库存,达到流量削峰的效果,防止一次性的大量请求导致服务器挂掉

4.负载均衡
拓展机器,使用Ngnix进行负载均衡,分担流量压力,同时还可拦截恶意请求。

5.限流
一旦产品卖光,前端直接秒杀结束,避免后续无效的请求

你可能感兴趣的:(浅谈秒杀系统设计思路)