• 高并发,不怕不怕「限流算法第一把法器:计数器法」


    在开发高并发系统时,如何来保护系统呢?

    (1)缓存:缓存简单理解就是把从数据库查询出来的数据,存放到缓存系统上,比如Memcached或者redis,然后下次再来获取的时候,直接从缓存中进行获取。缓存的目的是提升系统访问速度和增大系统处理容量。

    (2)降级:降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开。

    (3)限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。简单理解就是在1秒之内有1000个请求(流量)来了,而系统只能处理100个/秒,那么这时候明显是无法处理过来的,很显然就会导致系统瘫痪了,那么对于这个请求流量,我们可以做一个限制,配置最多可接受的请求是100个/秒,多出来的请求,怎么办呢,那就限制住,直接返回一个提示,当前请求人数过多,请稍后再试,这就是限流(限制在某个时间窗口的最大流量)。

    常用的限流算法

    一、计数器算法原理

    计数器法是限流算法里最简单也是最容易实现的一种算法,一般我们会限制一秒钟能够通过的请求数。比如我们规定,对于A接口来说,我们1分钟的访问次数不能超过100个。那么我们可以这么做:在一开始的时候,我们可以设置一个计数器counter,每当一个请求过来的时候, counter就加1,如果counter的值大于100并且该请求与第一个请求的间隔时间还在1分钟之内,那么说明请求数过多; 如果该请求与第一个请求的间隔时间大于1分钟,且counter的值还在限流范围内,那么就重置 counter。

    二、计数器算法小实现

             对于技术,再多的理论,都不如实践来的好理解,来,我看下要怎么实现。

    看下具体的一个代码:

    public class Counter {  public long timeStamp = System.currentTimeMillis(); // 当前时间  public int reqCount = 0; // 初始化计数器  public final int limit = 100; // 时间窗口内最大请求数  public final long interval = 1000 * 60; // 时间窗口ms
      public boolean limit() {    long now = System.currentTimeMillis();    if (now < timeStamp + interval) {      // 在时间窗口内      reqCount++;      // 判断当前时间窗口内是否超过最大请求控制数      return reqCount <= limit;    } else {      timeStamp = now;      // 超时后重置      reqCount = 1;      return true;    }  }}
    

    说明:上面代码逻辑很简单,就是在1秒之内进行统计请求的总个数,然后校验请求的个数是否超过了限制的请求数,如果在1秒之外,那么就重置请求数。

    弊端

    对于秒级以上的时间周期来说,会存在一个非常严重的问题,那就是临界问题。

    从上图中我们可以看到,假设有一个恶意用户,他在0:59时,瞬间发送了100个请求,并且1:00又瞬间发送了100个请求,那么其实这个用户在 1秒里面,瞬间发送了200个请求。我们刚才规定的是1分钟最多100个请求,也就是每秒钟最多1.7个请求,用户通过在时间窗口的重置节点处突发请求, 可以瞬间超过我们的速率限制。用户有可能通过算法的这个漏洞,瞬间压垮我们的应用。

    三、小思考

    (1)计算器算法存在的问题,可以怎么解决呢?

    (2)应用限流的常用算法你都知道哪些?你理解了嘛?

  • 相关阅读:
    程序员该如何学习技术
    HJ65 查找两个字符串a,b中的最长公共子串
    Linux性能优化实践(1): 进程长时间不被调度执行案例
    旅游网页设计 web前端大作业 全球旅游私人订制 旅游公司网站模板(HTML+CSS+JavaScript)
    手撕AVL树
    基于ADS的marx雪崩电路设计-设计实践(射频脉冲源)
    从RNN到LSTM
    最详细的Keycloak教程:Keycloak实现手机号、验证码登陆——(一)Keycloak的下载与使用
    制造商面临的常见网络威胁是什么,他们如何保护自己
    Linux之租云服务器及配docker环境
  • 原文地址:https://blog.csdn.net/Park33/article/details/126052112