当前位置:   article > 正文

限流算法及 RateLimiter 的使用和代码解读_rate must be positive

rate must be positive

为什么要限流

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统能处理的容量,可谓是抗高并发流量的银弹;而降级是当服务出问题或者影响到核心流程的性能则需要暂时屏蔽掉,待高峰或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询(评论的最后几页),因此需有一种手段来限制这些场景的并发/请求量,即限流。

互联网雪崩效应解决方案

服务降级:在高并发的情况, 防止用户一直等待,直接返回一个友好的错误提示给客户端。
服务熔断:在高并发的情况,一旦达到服务最大的承受极限,直接拒绝访问,使用服务降级。
服务隔离:

  • 雪崩效应产生原因:因为默认情况下,只有一个线程池维护所有的服务接口,如果有大量的请求访问同一个接口,达到线程池默认极限,可能会导致其他服务无法访问。
  • 解决服务雪崩效应:使用服务隔离机制,使用线程池方式隔离,相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样就可以解决雪崩效应。

服务限流:在高并发的情况,一旦服务承受不了,使用服务限流机制

限流算法

常见的限流算法有:令牌桶、漏桶。计数器也可以简单粗暴地实现限流。

计数器

它是限流算法中最简单最容易的一种算法,比如我们要求某一个接口,3秒钟内的请求不能超过3次。
我们可以在开始时设置一个计数器,每次请求,该计数器+1;
如果该计数器的值大于3并且与第一次请求的时间间隔在3秒钟内,那么说明请求过多,应该限流;
如果该请求与第一次请求的时间间隔大于3秒钟,并且该计数器的值还在限流范围内,那么重置该计数器。

/**
 * 计数器限流
 */
public class LimitCountDemo {
   
    private int limtCount = 3;// 限制最大访问的容量
    AtomicInteger atomicInteger = new AtomicInteger(0); // 每秒钟 实际请求的数量
    private boolean isReset = false;
    private long start = System.currentTimeMillis();// 获取当前系统时间
    private int interval = 3000;// 间隔时间
    private final ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); // 线程池

    private static final Logger logger = LoggerFactory.getLogger(LimitCountDemo.class);
    private static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");

    private synchronized boolean acquire() {
   
        long newTime = System.currentTimeMillis();
        if (newTime > (start + interval) && !isReset) {
   
            isReset = true;
            // 判断是否是一个周期
            start = newTime;
            logger.info("start=" + sdf.format(new Date(start)));
            atomicInteger.set(0); // 清理为0
        }
        if (isReset) {
   
            isReset = false;
        }
        int i = atomicInteger.incrementAndGet();// i++;
        logger.info("atomicInteger=" + i);
        return i <= limtCount;
    }

    private void access() {
   
        for (int i = 1; i <= 6; i++) {
   
            final int tempI 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/224974
推荐阅读
相关标签
  

闽ICP备14008679号