
文章插图
秒杀验证码
虽然说我上面通过动态URL避免了用户在秒杀开始前请求秒杀链接,但是用户还是可以通过脚本在秒杀开始的那一刻去请求秒杀连接,普通用户基本没有办法和脚本秒杀进行竞争 。我们可以引入机器难以识别的验证码,用户在请求秒杀链接之前,需要填写验证码识别的结果,验证码错误的请求直接拒绝 。使用验证码不仅可以增加脚本秒杀的难度,还可以降低请求的QPS,因为请求不再是在秒杀那一刻进来,而会被分散到填写验证码的时间段内 。

文章插图
过滤请求
通过上面的步骤,我们可以减少很多重复请求和脚本请求,可以保证秒杀活动中一个人大致只会请求一次(脚本还是可以请求多次) 。但是100W人参与秒杀,每人请求一次秒杀链接也有将近100W次请求,服务器还是扛不住 。仔细分析之后可以发现,秒杀的商品只有100个,最后成功的也只有100个,那么我们100W的请求是不是都有必要请求到秒杀服务器上呢?显而易见,我们没有必要把所有请求都打到秒杀服务器上,我们只需要保证有大于100个请求打到秒杀服务器就可以保证秒杀的正常进行,所以我们可以在用户端和服务端添加一层过滤层,过滤层只要保证有100个以上的请求能打到秒杀服务器端 。
我们可以使用Nginx服务器来构建过滤层,一个Nginx服务器也没法抗100W的请求,我们假设每个Nginx服务器可以处理10W的请求,那么我们就需要10台Nginx 。那么怎么用保证至少有100个请求可以请求到后端呢?我们可以简单的让每个Nginx服务器只通过前100个请求,后续请求直接返回降级界面 。通过Nginx过滤,我们可以把100W的请求过滤为1000个请求,大大减少了服务器端的压力 。

文章插图
Redis缓存
如果通过前面的过滤,请求量依旧非常大,如果数据库无法处理这些请求量,我们就需要在数据库之上添加一层Redis缓存了 。单个Redis可以处理几万的QPS,如果预估请求的QPS大于几万,我们还可以使用Redis集群模式来增加Redis的处理能力 。
在Redis存放和售卖商品数目大小相同的数字,秒杀服务每次访问数据库之前,都需要先去Redis中扣减库存,扣减成功才能继续更新数据库 。这样,最终到的数据库的请求数目和需要售卖商品的数目基本一致,数据库的压力可以大大减少 。
Redis原子性
我们知道Redis是不支持事务的,所以可能出现扣减为负数的情况,这种情况下我们可以使用Lua脚本来保证一次扣减操作的原子性,从而保证扣减结果的正确性 。

文章插图
异步更新数据库
通过Redis判断之后,去更新数据库的请求都是必要的请求,这些请求数据库必须要处理,但是如果数据库还是处理不过来这些请求怎么办呢?
这个时候就可以考虑削峰填谷操作了,削峰填谷最好的实践就是MQ了 。经过Redis库存扣减判断之后,我们已经确保这次请求需要生成订单,我们就可以通过异步的形式通知订单服务生成订单并扣减库存 。

文章插图
- 淘宝店铺历史宝贝怎么重新上架 历史宝贝如何重新上架
- 淘宝商品推荐指数 淘宝指数
- 淘宝上的原单是什么意思 淘宝原单是什么意思
- 1688会员名怎么注册 1688淘宝会员怎么注册账号啊
- 淘宝上挂号的么软件啊 淘宝挂号怎么操作
- 淘宝模板怎么做 淘宝模板如何制作
- 机器抢拍软件 淘宝抢拍机器
- 淘宝刷钻被处罚 淘宝刷钻石有风险吗知乎
- 淘宝店铺转让 天猫店铺转让流程
- 红人馆 淘宝红人馆店铺
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
