系统架构中的限流算法(一)
Sentinel限流/计数器限流/滑动时间窗口限流/漏桶限流/令牌桶限流
- 1. 计数器限流算法
- Java实现计数器限流算法
- 2. 滑动时间窗口限流算法
- Java实现滑动窗口限流算法
- 3. 漏桶限流算法
- Java实现漏桶限流算法
- 4. 令牌桶限流算法
- 5. 限流算法总结
- 6. 微服务限流组件
- 7. 单机限流和分布式限流
- 8. 限流的难点
- 9. 限流组件
1. 计数器限流算法
计数器算法是限流算法里最简单也是最容易实现的一种算法。
比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。
那么我们可以这么做:在一开 始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候,counter就加1,如果counter的值大于100并且该请求与第一个 请求的间隔时间还在1分钟之内,那么说明请求数过多;
如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter,具体算法的示意图如下:
Java实现计数器限流算法
public interface TrafficLimiter {/*** 限流*/Boolean limit();
}
/*** 计数器限流算法*/
public class CounterLimiter implements TrafficLimiter {private long timestamp = System.currentTimeMillis();//请求次数private int reqCount;//每秒限流的最大请求数private int limitNum = 100;//时间窗口时长,单位msprivate long interval = 1000L;/*** 返回true表示限流,false代表通过* @return*/@Overridepublic synchronized Boolean limit() {long now = System.currentTimeMillis();//在当前时间窗口内if(now < timestamp + interval){//判断当前时间窗口请求数加1是否超过每秒限流的最大请求数if(reqCount + 1 > limitNum){return true;}reqCount++;return false;}else{//开启新的时间窗口timestamp = now;//重置计数器reqCount = 1;return false;}}
}
用法如下(以下算法的用法相同)
public class Test