服务限流之计数器方式

本文介绍了使用计数器算法进行服务限流的方法,例如限制接口每分钟请求不超过10次。当计数器超过限制且请求时间在1分钟内,将拒绝请求。若请求间隔超过1分钟且计数器在限流范围内,则重置计数器。但这种方法在临界点可能存在缺陷。
摘要由CSDN通过智能技术生成

最简单最容易的一种算法,比如我们要求某一个接口,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;
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值