学习空间JVM · Java虚拟机原理 · JVM上语言·框架· 生态系统Java

服务限流之计数器方式

2021-12-19  本文已影响0人  迦叶_金色的人生_荣耀而又辉煌

上一篇 <<<服务的隔离、降级和熔断
下一篇 >>>服务限流之滑动窗口计数


最简单最容易的一种算法,比如我们要求某一个接口,1分钟内的请求不能超过10次,我们可以在开始时设置一个计数器,每次请求,该计数器+1;
如果该计数器的值大于10并且与第一次请求的时间间隔在1分钟内,那么说明请求过多,如果该请求与第一次请求的时间间隔大于1分钟,并且该计数器的值还在限流范围内,那么重置该计数器。
缺陷:在临界点会存在问题

/**
 * 功能说明: 纯手写计数器方式<br>
 */
public class LimitService {

   private int limtCount = 60;// 限制最大访问的容量
   AtomicInteger atomicInteger = new AtomicInteger(0); // 每秒钟 实际请求的数量
   private long start = System.currentTimeMillis();// 获取当前系统时间
   private int interval = 60;// 间隔时间60秒

   public boolean acquire() {
      long newTime = System.currentTimeMillis();
      if (newTime > (start + interval)) {
         // 判断是否是一个周期
         start = newTime;
         atomicInteger.set(0); // 清理为0
         return true;
      }
      atomicInteger.incrementAndGet();// i++;
      return atomicInteger.get() <= limtCount;
   }

   static LimitService limitService = new LimitService();

   public static void main(String[] args) {

      ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
      for (int i = 1; i < 100; i++) {
         final int tempI = i;
         newCachedThreadPool.execute(new Runnable() {

            public void run() {
               if (limitService.acquire()) {
                  System.out.println("你没有被限流,可以正常访问逻辑 i:" + tempI);
               } else {
                  System.out.println("你已经被限流呢  i:" + tempI);
               }
            }
         });
      }
   }
}

推荐阅读:
<<<高并发架构的整体思路
<<<一个网站访问慢的真正原因
<<<高并发情况下,接口的代码会存在哪些问题
<<<压缩静态资源减少带宽传输的方式
<<<动静分离架构模式
<<<缓存策略汇总
<<<后端服务的雪崩效应及解决思路
<<<服务的隔离、降级和熔断
<<<服务限流之滑动窗口计数
<<<服务限流之令牌桶算法
<<<服务限流之漏桶算法
<<<漏桶算法和令牌桶算法的区别
<<<自定义封装限流算法
<<<应用级限流
<<<接入层限流

上一篇下一篇

猜你喜欢

热点阅读