Java服务限流算法

网站建设5年前发布
14 0 0

限流其实就是对服务的请求做一下QPS的控制,对于有些免登录的接口需要做一下访问的限制,不能无限制的去请求接口,不然的话会给服务器造成很大的压力,而且我们也希望一些接口做一下控制,控制请求量,这样我们就可以做一个plugin对服务做限流操作,超出限流就返回请求失败,保证系统的稳定运行。主要概念就是阈值以及拒绝策略,实际中需要用到限流的的比如,验证码,白名单,当然也有容器的限流,比如nginx就是比较常用的,可以做一下简单的处理。,几种算法的使用,一些基础代码如下,2023030613560113d61b03161cb84fffa912e631e4cbaffa73c6812,其实就是原子计数法,就是在固定时间内,允许请求量是多少,每次请求就在计数器上加1,设置计数器的过期时间,当计数器的阈值达到限流配置的数时候,就执行拒绝策略,超过了时间,计数器就会重新归0。,比如上图中,会限制在每秒限制请求数为2,就是在每秒的时间会限制请求为2,但是会出现极端的情况,比如在前一个时间段中的前500ms和后500ms,请求数都是2,这样就会看到在这一秒内是有4个请求的,这就是会出现请求的问题,当然这也是最简单的限流算法。,2023030613560152efa72676766a5ec56560e0a481d2c3696f0b310,滑动时间窗口算法,其实就是对固定窗口的改进,知道了固定时间窗口会出现极端的情况,那滑动就在下一个临界的时候,进行处理时间,其实就是在某一段时间进行处理时间。,比如上图中每 500ms 滑动一次窗口,可以发现窗口滑动的间隔越短,时间窗口的临界突变问题发生的概率也就越小,不过只要有时间窗口的存在,还是有可能发生时间窗口的临界突变问题。,这个是记录下所有的请求时间点,新请求先判断最近指定时间范围内的请求数量是否超过指定阈值,来确定是否达到限流,虽然没有时间窗口突变的问题,限流比较准确,但是要记录下每次请求的时间点,所以占用的内存较多。,20230306135626957245e274e7beb883c853fde7af9cba2e947d225,此算法就是定义一个桶的容量,然后每次的请求过来都放在桶里面,一直等到桶满了以后就会执行拒绝策略,然后在桶不满的情况下,会按照固定的速率去执行请求,其实就是按照固定流速去执行请求,保证单位时间内的执行请求量是固定的。,漏桶就是按照某一个请求的稳定的速度处理发来的请求数量,可以很好地保证系统的稳定运行,只能平稳处理请求,这也是他的一个缺点,不能处理面对突然来的高的请求量,会导致请求一直处于哎队列等待中,不能面对高并发下的请求处理,比较保守的处理逻辑,2023030613560222c117c61216e33d198063ac3a9dbaa356ecc2619,此算法也是对于漏桶的算法的改进,这个逻辑是桶里面有一个阈值,按照一定的速率进行在桶里面存放令牌,直到令牌满了,就不在新增令牌,然后请求每次来就去桶中获取令牌,获取到了,就进行处理,没有令牌则执行拒绝策略,这个算法其实原理类似于生产者,消费者的模型,生产者按照一定的速度生成令牌,消费者可以消费数据,相对来说,这个是比较好用的,其实这几种算法,不能说哪一个是最好的,只能说是要的业务逻辑是什么样的,选择合适的限流算法来满足自己的业务实现,没有最优,只有最合适。

© 版权声明

相关文章