秒杀系统的业务逻辑非常简单,一般就是下订单减库存,难点在于我们如何保障秒杀能够顺利进行。
就有了
1.高并发 2.高性能
3.高可用 4.一致性
- 秒杀开始的时候,会有大量用户同时参与进来,因此秒杀系统一定要满足 高并发 和 高性能 。
- 为了保证秒杀整个流程的顺利进行,整个秒杀系统必须要满足 高可用 。
- 除此之外,由于商品的库存有限,在面对大量订单的情况下,一定不能超卖,我们还需要保证 一致性 。
想简单点,那么多的请求访问进来,肯定处理不过来,那就把他们放到消息队列里面去,后端服务再去消费
如何避免脚本呢
那就是验证码,作用很大,也可以避免用户的集中请求
高并发/高性能
第一步,检测热点数据,放到 jvm 内存中,做到访问速度更快,Redis就可以实现,
第二步,流量消峰,把请求都放在消息队列中,让后端服务慢慢消费,就不会直接把服务干跨
高可用
1.集群
就离不开 集群 比如Redis的集群
可以通过Redis的异步复制 , 一主多从
master一旦挂掉,slave直接成为 master,Redis中的哨兵 Sentinel 模式可以解决
Sentinel 是 Redis 的一种运行模式 ,它主要的作用就是对 Redis 运行节点进行监控。当 master 节点出现故障的时候, Sentinel 会帮助我们实现故障转移,确保整个 Redis 系统的可用性。整个过程完全自动,不需要人工介入!
2.限流
对请求频率进行限制
比如系统能支撑10W个请求,来了15W的请求,那么就会拦截掉这多余的5W请求
3.排队
就是15W的请求在那里排队进去,后面的请求需要等,体验感很不好
4.降级
就是丢车保帅,释放服务器没必要的资源和流量,去保证那些热点数据的正常访问
5.熔断
熔断和降级很容易混淆,其中降级 适度系统自身的服务,而熔断是为了确保外部的服务不会因为本身的服务而瘫痪
一致性
- 下单即减库存 :只要用户下单了,即使不付款,我们就扣库存。
- 付款再减库存 :当用户付款了之后,我们在减库存。不过, 这种情况可能会造成用户下订单成功,但是付款失败。
- 对超过一定时间不付款的订单特殊处理,释放库存。
最关键的是要保证接口幂等性
加锁!!!,一定要加锁,防止一个人发起了几个请求