秒杀系统设计
一、访问层
1. (秒杀商品页)秒杀页面为静态页面,从而减少服务器的压力,服务端只需要一心的解决秒杀的请求即可2. (秒杀按钮)(1)活动前禁用按钮(2)点击后禁用按钮(3)增加滑动验证码(防止羊毛党)(4)排队机制,提高用户体验
二、中间转化层
1. nginx负载均衡,如果并发量超过了两三万的话,可以做nginx集群,一旦nginx集群,就得在其上层部署硬件级别的负载均衡器,比如F5或者LVS2. nginx负载均衡到网关之后,网关(也可以做集群)可以根据客户端的负载均衡器比如rabbion,来进行客户端的负载均衡分发请求3. redis缓存(1)热点商品数据预热,防止大量请求访问,压垮数据库(2)lua脚本管理库存:用户秒杀下单时分好几步,第一步判断库存是否大于0,第二步减去业务库存,第三步替换库存三步,用lua脚本写成原子性的,防止线程不安全(3)防重复下单,利用redis的setNX命令,ip+token+商品信息作为key(4)分布式锁,setNX给锁加过期时间,为了如果锁一直不释放的话,不会出现死锁的情况。最终使用Redisson框架。Redisson的使用,引入依赖,连接redis,加有效时间锁,锁续期都没问题。5. 总结:3层负载均衡器:F5/LVS=>nginx=>网关=>客户端 就可以处理每秒10万以上的QPS的并发量6. 注意:限流(在nginx层做好限流、网关层设置限流、熔断机制)
三、mq消息队列
mq消息队列秒杀成功之后,发送mq消息,再用mq进行异步下单,完成后续的数据库更新,削峰填谷。