分析:
1,瞬间流量非常大,不能用堆机器的方式来提高QPS
2,秒杀商品库存少,人数多,服务器短时间内压力大。
3,秒杀开始之前,刷新量很大,造成服务器压力。
总结出一个秒杀系统中的关键点要满足高并发,快响应,防止超卖,防止恶意刷子问题
设计:
1,秒杀入口设置开关设计
2,订单后续逻辑设置成异步
3,订单失败补偿机制
4,服务降级。
方案:
1,满足高并发,热点数据预加载,配置专门的MQ.前端页面静态化,服务器负责均衡配置。
2,防止超卖,可以在秒杀活动开始之前把库存数据,商品信息同步到redis缓存,在秒杀时,判断库存是否充足和扣减库存这两个动作使用lua脚本,保证数据原子性,防止超卖。
3,防止刷子,可以通过限流,用户ID限流,同一IP地址限流,做了限流之后,能够防止一些无效的请求,减轻服务器压力。
4,秒杀入口开关设计,在秒杀 开始之前将秒杀按钮设置为禁止,将秒杀链接隐藏,将秒杀链接进行加密处理。
5,订单后续逻辑设置成异步,可以将秒杀成功的消息放入mq,后续服务异步反馈给用户。
6.订单失败补偿:设置订单失败机制保证订单一定能成功,在秒杀成功后,要保证订单一定处理成功,用MQ进行驱动,失败重试,加报警机制,保证及时监控到报警。
7,服务降级:服务出现问题,或bug,开启服务降级开关,禁止下单及时止损。
解决秒杀超卖少买问题:
Redi缓存:
当用户在前端下单时,我们通过操作Redis对商品的库存进行扣减,在扣减完Redis中的库存后再把扣减成功的消息发送到消息队列,之后交给具体的业务系统处理。