削峰(大闸)限流(限流器+队列)方案
为了承载高并发,就要用到一些技术组合,这里记录下削峰限流组合的方案流程。
下单前先去验证下,目的是交易是为了让有权限的人来交易,而一下子来了1000人,结果只有100人有权限,如果让这1000人都先去交易再看有权限没有,就会很浪费性能。因此可以提前筛选下,让验证通过的直接交易就可以了。
所以现在削减流量的环节就可以放在验证上了,大致流程如下:
- 用户验证后就会获得一个令牌,有这个令牌就可以交易。
- 但是令牌的发放量也得有限制。因为有权限的人肯定比可交易量大,所以令牌就限制为可交易量大小。即有10000人,有1000人权限,但库存只有100,就只发放100个令牌去让那1000人抢。
- 所以现在需要一个大闸(就是一个参数)来限制令牌发放量,每发放一个令牌,大闸就减一,减到0就不发放令牌了。
- 但如果本来库存就很多,有100万的库存,这时如果发放100万个令牌,并发量也很大。所以这时候就需要一个限流器来限制单机的TPS(比如一个服务器只能承受1万的并发,由于 Nginx 是随机分发流量的,一下子发了5万的请求给它,服务器就会一下就崩了)。
- 为了完美发挥服务器的性能,限流器的值一般设置在最高并发量左右。但如果这时请求都去交易会产生一个阻塞,那么交易环节就变慢了,这时不理想的。所以就需要一个队列(就是线程池)来缓冲下请求到交易的环节。
那么还能不能在验证前再限制下呢?可以的,我这里就记录了下使用验证码