常见的限流算法

限流:通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理

1、计数法(固定时间窗口限流算法):

选定一个时间的起点,之后每当有接口请求到来,我们就将计数器加1,如果在当前时间窗口内,根据限流规则(每秒钟允许100次访问请求),出现累加访问次数超过限流值情况,我们请拒绝后续访问请求。当进入下一个时间窗口后,计数器就清零重新计数。

缺点:限流策略过于粗略,无法应对两个时间窗口临界时间内的突发流量

2、滑动时间窗口限流算法:

在任意1s的时间窗口内,接口的请求次数都不能大于K次。

维护一个K+1的循环队列,用来记录1s内到来的请求,【当队列满时,tail指向的位置实际上是没有存储数据的,所以循环队列会浪费一个数组的存储空间】

当有新的请求到来时,我们将与这个新请求的时间间隔超过1s的请求,从队列中删除。然后我们再来看循环队列中是否有空闲位置。如果有,则把新请求存储在队列尾部,如果没有,则说明1s内的请求次数已经超过了限流值K,所以这个请求被拒绝服务。

缺点:只能在选定时间粒度上限流,对选定时间粒度内的更加细粒度的访问频率不做限制。

循环队列代码:

/**
 * 队空条件 head == tail
 * 队满条件 (tail + 1)% n == head
 * 当队列满时,tail指向的位置实际上是没有存储数据的,所以循环队列会浪费一个数组的存储空间。
 */
public class CircularQueue {

    private String[] items;
    private int n; //队列大小
    private int head = 0;
    private int tail = 0;

    public CircularQueue(int capacity) {
        items = new String[capacity];
        this.n = capacity;
    }



    public boolean enqueue(String item) {
        //队列满了
        if ((tail + 1) % n == head) return false;
        items[tail] = item;
        tail = (tail + 1) % n;
        return true;
    }

    public String dequeue() {
        if (head == tail) return null; //head == tail 队列是空
        String ret = items[head];
        head = (head + 1) % n;
        return ret;

    }
}  

常用的更平滑的限流算法:漏桶算法和令牌桶算法。

3、漏桶算法:

水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求可以看出漏桶算法能强行限制数据的传输速率。

缺点:对于突发的流量缺乏效率。

4、令牌桶:Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。

系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token,如果桶已经满了就不再加了。新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务。

好处:允许流量一定程度的突发。

可以方便的改变速度. 一旦需要提高速率,则按需提高放入桶中的令牌的速率. 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量

转载于:https://www.cnblogs.com/wjh123/p/11442632.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hystrix提供了限流功能,用于在高并发访问下控制系统资源。在Spring Cloud架构中,可以在网关和每个微服务中启用Hystrix进行限流处理。其中,Hystrix支持两种限流算法:线程隔离和信号量隔离。 线程隔离模式下的限流算法是通过控制调用线程允许请求HystrixCommand.GetFallback()的最大数量来实现的。可以通过配置属性hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds来设置超时时间,以及hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests来设置允许的最大并发请求数量。如果降级线程的并发数超过最大限制数,则会抛出HystrixRuntimeException异常。 信号量隔离模式下的限流算法是通过控制信号量的数量来实现的。可以通过配置属性hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests来设置允许的最大并发请求数量。如果超过最大限制数,则会直接抛出HystrixRuntimeException异常。 综上所述,Hystrix提供了线程隔离和信号量隔离两种限流算法,可以根据具体场景选择适合的算法来进行限流处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Hystrix 限流、超时、熔断和降级](https://blog.csdn.net/zsh2050/article/details/114878025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值