Tip:据我所知国内某大厂就是在去年春节活动期间租光了亚洲所有的服务器,小公司也很喜欢在双十一期间买流量机来顶住压力 。

文章插图
这样一对比是不是觉得你的集群能顶很多了 。
恶意请求拦截也需要用到它,一般单个用户请求次数太夸张,不像人为的请求在网关那一层就得拦截掉了,不然请求多了他抢不抢得到是一回事,服务器压力上去了,可能占用网络带宽或者把服务器打崩、缓存击穿等等 。
资源静态化:
秒杀一般都是特定的商品还有页面模板,现在一般都是前后端分离的,所以页面一般都是不会经过后端的,但是前端也要自己的服务器啊,那就把能提前放入cdn服务器的东西都放进去,反正把所有能提升效率的步骤都做一下,减少真正秒杀时候服务器的压力 。
按钮控制:
大家有没有发现没到秒杀前,一般按钮都是置灰的,只有时间到了,才能点击 。
这是因为怕大家在时间快到的最后几秒秒疯狂请求服务器,然后还没到秒杀的时候基本上服务器就挂了 。
这个时候就需要前端的配合,定时去请求你的后端服务器,获取最新的北京时间,到时间点再给按钮可用状态 。
按钮可以点击之后也得给他置灰几秒,不然他一样在开始之后一直点的 。你敢说你们秒杀的时候不是这样的?
限流:
限流这里我觉得应该分为前端限流和后端限流 。
前端限流:这个很简单,一般秒杀不会让你一直点的,一般都是点击一下或者两下然后几秒之后才可以继续点击,这也是保护服务器的一种手段 。
后端限流:秒杀的时候肯定是涉及到后续的订单生成和支付等操作,但是都只是成功的幸运儿才会走到那一步,那一旦100个产品卖光了,return了一个false,前端直接秒杀结束,然后你后端也关闭后续无效请求的介入了 。
Tip:真正的限流还会有限流组件的加入例如:阿里的Sentinel、Hystrix等 。我这里就不展开了,就说一下物理的限流 。
库存预热:
秒杀的本质,就是对库存的抢夺,每个秒杀的用户来你都去数据库查询库存校验库存,然后扣减库存,撇开性能因数,你不觉得这样好繁琐,对业务开发人员都不友好,而且数据库顶不住啊 。
开发:你tm总算为我着想一次了 。
那怎么办?
我们都知道数据库顶不住但是他的兄弟非关系型的数据库Redis能顶啊!
那不简单了,我们要开始秒杀前你通过定时任务或者运维同学提前把商品的库存加载到Redis中去,让整个流程都在Redis里面去做,然后等秒杀介绍了,再异步的去修改库存就好了 。
但是用了Redis就有一个问题了,我们上面说了我们采用主从,就是我们会去读取库存然后再判断然后有库存才去减库存,正常情况没问题,但是高并发的情况问题就很大了 。
这里我就不画图了,我本来想画图的,想了半天我觉得语言可能更好表达一点 。
多品几遍!!!就比如现在库存只剩下1个了,我们高并发嘛,4个服务器一起查询了发现都是还有1个,那大家都觉得是自己抢到了,就都去扣库存,那结果就变成了-3,是的只有一个是真的抢到了,别的都是超卖的 。咋办?
Lua:
之前的文章就简单的提到了他,我今天就多一定点篇幅说一下吧 。
Lua 脚本功能是 Reids在 2.6 版本的最大亮点, 通过内嵌对 Lua 环境的支持, Redis 解决了长久以来不能高效地处理 CAS (check-and-set)命令的缺点, 并且可以通过组合使用多个命令, 轻松实现以前很难实现或者不能高效实现的模式 。Lua脚本是类似Redis事务,有一定的原子性,不会被其他命令插队,可以完成一些Redis事务性的操作 。这点是关键 。
知道原理了,我们就写一个脚本把判断库存扣减库存的操作都写在一个脚本丢给Redis去做,那到0了后面的都Return False了是吧,一个失败了你修改一个开关,直接挡住所有的请求,然后再做后面的事情嘛 。
限流&降级&熔断&隔离:
这个为啥要做呢,不怕一万就怕万一,万一你真的顶不住了,限流,顶不住就挡一部分出去但是不能说不行,降级,降级了还是被打挂了,熔断,至少不要影响别的系统,隔离,你本身就独立的,但是你会调用其他的系统嘛,你快不行了你别拖累兄弟们啊 。
削峰填谷:
一说到这个名词,很多小伙伴就知道了,对的MQ,你买东西少了你直接100个请求改库我觉得没问题,但是万一秒杀一万个,10万个呢?服务器挂了,程序员又要背锅的 。
推荐阅读
- 干果放久了潮了怎么办 果仁受潮了如何干燥
- 最齐全的羊肉16个部位图解,真正的教您如何食用羊肉和辨别真羊肉
- 自动挡上坡,动力不足该如何换挡?换不好有可能车毁人亡?
- 如何养紫砂茶具好
- 电蚊香液洒了如何清理 蚊香液滴到床单上怎么洗
- 如何避免淘宝商品违规 买家淘宝违规是什么原因造成的
- 卧室隔断设计的几种流行方式
- 办公空间装修设计的原则及要点
- 如何养把俊秀的壶
- 普洱茶如何发酵,普洱茶如何界定
