限流算法之计数器算法

Posted codingjav

tags:

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

计数器法是限流算法里最简单也是最容易实现的一种算法。

假设一个接口限制一分钟内的访问次数不能超过100个,维护一个计数器,每次有新的请求过来,计数器加一,这时候判断,如果计数器的值小于限流值,并且与上一次请求的时间间隔还在一分钟内,

允许请求通过,否则拒绝请求,如果超出了时间间隔,要将计数器清零。

/**
 * 限流算法集合
 */
@Slf4j
public class RateLimitUtils {

    //初始时间
    private static long startTime = System.currentTimeMillis();
    //初始计数值
    private static final AtomicInteger ZERO = new AtomicInteger(0);
    //时间窗口限制
    private static final long interval = 1000;
    //限制通过请求
    private static int limit = 100;
    //请求计数
    private AtomicInteger requestCount = ZERO;

    /**
     * 固定时间窗口算法
     * <p>
     *     可以使用在分布式环境下,使用单点存储计数值,比如redis、并且设置自动过期时间,这时候就可以统计整个集群的流量,并且进行限流。
     *     缺点是不能处理临界问题,或者说限流策略不够平滑;
     *     可能在限流临界点来了双倍的流量,c超过系统的限制;
     *     计数器限流允许出现 2permitsPerSecond 的突发流量,可以使用*滑动窗口算法去优化。
     * </p>
     * @return
     */
    public boolean tryAcquire() {
        long now = System.currentTimeMillis();
        //在时间窗口内
        if (now < startTime + interval) {
            //判断是否超过最大请求
            if (requestCount.get() < limit) {
                requestCount.incrementAndGet();
                return true;
            }
            log.info("当前时间窗口内已经超过最大请求数");
            return false;
        } else {
            //新一轮时间窗口开启,超时重置
            startTime = now;
            requestCount = ZERO;
            return true;
        }
    }

}

以上是关于限流算法之计数器算法的主要内容,如果未能解决你的问题,请参考以下文章

限流算法原理和实现

SpringBoot - 优雅的实现流控

SOA架构之限流

高可用系统设计 | 分布式限流策略:计数器算法漏桶算法令牌桶算法

高可用系统设计 | 分布式限流策略:计数器算法漏桶算法令牌桶算法

常见限流算法分析