learn_note/分布式/服务限流算法.md

1.4 KiB
Raw Blame History

计数器算法

设置一个变量存储T时间内的访问量每当T时间后重置该变量为0当变量达到阈值后限制访问

滑动窗口算法

将时间周期划分为N个小周期分别记录每个小周期内访问次数并且根据时间滑动删除过期的小周期,滑动窗口的格子划分的越多,那么滑动窗口的滚动就越平滑,限流的统计就会越精确

漏桶算法

算法内部有一个容器,不管上面流量多大,下面流出的速度始终保持不变。

准备一个队列,用来保存请求,另外通过一个线程池定期从队列中获取请求并执行,可以一次性获取多个并发执行。

令牌桶算法

以一定的速率往桶中放令牌。每次请求调用需要先获取令牌,只有拿到令牌,才有机会继续执行,否则选择选择等待可用的令牌、或者直接拒绝。

准备一个队列,用来保存令牌,另外通过一个线程池定期生成令牌放到队列中,每来一个请求,就从队列中获取一个令牌

集群限流

每次有相关操作的时候就向redis服务器发送一个incr命令比如需要限制某个用户访问/index接口的次数只需要拼接用户id和接口名生成redis的key每次该用户访问此接口时只需要对这个key执行incr命令在这个key带上过期时间就可以实现指定时间的访问频率。