服务限流之计数器方式

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


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

/**
 * 功能说明: 纯手写计数器方式
*/ 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); } } }); } } }

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

你可能感兴趣的:(服务限流之计数器方式)