高并发下的超卖问题
超卖问题的处理需多角度进行流量的控制
前端(防止用户的操作发出大量请求)
首先是页面的按钮防抖,防止用户发出大量请求
(有用的请求并没有那么多,如果可以,也可以直接在前端用随机的方式进行处理(直接随机给用户一个你没抢到.....))
利用cdn缓存静态资源(减轻服务器的压力),手动推给cdn进行预热
这样大量的请求就会打到cdn而不是所有地区的请求都到服务器
后端
瞬时流量的承接(前端也吸收了一部分的流量)
1,负载均衡
nginx(这个东西一般来说是做为前端的静态资源代理器,当然在这个地方也可以进行单个集群的负载均衡以及限流+黑名单)
设置的内容:
DB--防止超卖
乐观锁
乐观锁和悲观锁的内容不在这边进行叙述
DB--库存分组
将总库存也做集群,分为小库存,提高读写效率
DB--插入库存扣减流水
一直update行会出现问题,将update改为insert。插入数据的量不好控制会导致超卖
DB--热点行问题
数据库的热点行问题是指某些数据行被频繁访问或更新,导致这些行成为系统性能的瓶颈。(锁竞争)
解决方法之前的库存分组
db-redis缓存
用redis+lua的方式进行控制,先将大量写入数据放置到redis中进行处理,然后将redis的数据异步刷新到mysql中(在这里异步刷新的作用还有削峰填谷的作用)用来实现最终一致性,
除了这个db方案,还需要一个准时对账机制
lua脚本不单单需要进行库存的削减,还需要将流水zset进流水对列。定时拉取一段时间的流水和数据库的库存比较是否一致,不是则进行缓存。
如果发生了不一致
我们更倾向于认为数据库的数据可靠()根据数据库进行补偿
redis中的流水数据可能因为缓存失效和数据丢失而导致不一致
预防黑产
将行为异常的用户进行拉黑
幂等性
无论执行多少次,结果不变
兜底方案
直接关闭秒杀服务,秒杀服务的失败对于用户来说是可以接受的,直接止损
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
