秒杀:顾名思义,短时间内有大量的请求到达系统,而库存一般很少。
例如:网站低价活动秒杀,12306过年车票,短时间内需要大量读写有限的数据。
这就需要在系统的各个层级上面做出改变
1.客户端浏览器拦截
一般当网页提交出现卡顿时,用户的下意识是多次点击按钮,这样就平白的多了几倍的无效请求量
方案:使用js控制,点击后就不再发送请求了或点击后按钮置灰(仅仅这一步就可以在秒杀系统中,减少一半以上的压力)
2.站点地址前端拦截
一般用户(99%)通过以上方案就可以解决,但是懂一些技术的就可以直接通过查看请求地址,直接用for循环大量请求http地址,所以需要在站定层面上加上判断,同一个请求来源,一定时间内只能向后台请求一次,其余均返回同一页面
3.服务层请求拦截
假设黑客攻击呢?大量不同来源的请求(或真是或伪造),如果是写操作,使用队列,每次只允许一定数量,成功后再进行下一批,如果是读,直接使用cache.
4.数据层排队
此时真正到达数据层的请求,一般来说就不算太大了,库存有限,放进来那么多请求也是无用,徒增请求压力
原则:尽量把请求拦截在系统上游
都多写少多用缓存
当然了,对一些商品类型唯一,数量明确的情况,可以直接提前把数据查出来放入缓存中也是一个不错的方案。