削峰限流与防刷

Posted 无恙_z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了削峰限流与防刷相关的知识,希望对你有一定的参考价值。

削峰(大闸)限流(限流器+队列)方案

为了承载高并发,就要用到一些技术组合,这里记录下削峰限流组合的方案流程。

下单前先去验证下,目的是交易是为了让有权限的人来交易,而一下子来了1000人,结果只有100人有权限,如果让这1000人都先去交易再看有权限没有,就会很浪费性能。因此可以提前筛选下,让验证通过的直接交易就可以了。

所以现在削减流量的环节就可以放在验证上了,大致流程如下:

  1. 用户验证后就会获得一个令牌,有这个令牌就可以交易。
  2. 但是令牌的发放量也得有限制。因为有权限的人肯定比可交易量大,所以令牌就限制为可交易量大小。即有10000人,有1000人权限,但库存只有100,就只发放100个令牌去让那1000人抢。
  3. 所以现在需要一个大闸(就是一个参数)来限制令牌发放量,每发放一个令牌,大闸就减一,减到0就不发放令牌了。
  4. 但如果本来库存就很多,有100万的库存,这时如果发放100万个令牌,并发量也很大。所以这时候就需要一个限流器来限制单机的TPS(比如一个服务器只能承受1万的并发,由于 nginx 是随机分发流量的,一下子发了5万的请求给它,服务器就会一下就崩了)。
  5. 为了完美发挥服务器的性能,限流器的值一般设置在最高并发量左右。但如果这时请求都去交易会产生一个阻塞,那么交易环节就变慢了,这时不理想的。所以就需要一个队列(就是线程池)来缓冲下请求到交易的环节。

那么还能不能在验证前再限制下呢?可以的,我这里就记录了下使用验证码来限制(因为每个人输验证码的速度是不一样的,这样就会分散请求发出的时间来达到平滑流量的目的)。

在这里插入图片描述

限流的两个算法(令牌桶算法、漏桶算法)


令牌桶算法

限流器会初始化令牌桶的数量,当这个数量没超过令牌桶的容量时,令牌生成器就会每秒生成一定数量的令牌往桶里丢(当满了后就会丢弃多出来的令牌)。

在这里插入图片描述

漏桶算法

在这里插入图片描述


防刷

这里只做了解下防止黄牛来刷单。有几个主流的防刷方式:

  • 从用户角度限制。后端来限制这个用户在短时间内的访问次数(比如一分钟内只能访问3次)。然而防不住黄牛有很多号…
  • 限制 IP。后端来限制这个IP地址在短时间内的访问次数。然而黄牛可能真的有很多IP,并且容易误杀…
  • 限制场景(推荐)。只能在手机终端秒杀,服务端会去采集设备的指纹来判断你的行为是否可疑。
    在这里插入图片描述

以上是关于削峰限流与防刷的主要内容,如果未能解决你的问题,请参考以下文章

削峰限流防刷和令牌桶算法少卖问题解决方式

网站防刷限流

springboot Redis + HandlerInerceptor实现接口防刷

通过注解实现接口限流防刷

分布式系统中的限流与熔断

最近学习了限流与RateLimiter