Dubbo 服务限流处理策略

Dubbo 服务限流处理策略

限流思路

  • 限流措施是系统高可用的一种手段
  • 使用并发与连接控制进行限流 (配置accepts、connections,一般用于系统内服务之间)
  • 使用漏桶和令牌桶算法进行限流

限流算法

  • 漏桶算法

漏桶算法.png

所有请求放在一个队列中,以固定的频率去处理这些请求,防止大流量请求导致服务崩溃

  • 令牌桶算法

令牌桶算法.png

1) 守护线程向令牌桶内存放令牌

2)当请求到达时,判断令牌桶中是否有剩余令牌,存在则携带令牌进行处理,反之处于等待状态或返回,不进行业务处理

  • 区别

令牌桶法相比于漏桶法具有更高的承载能力,漏桶法请求流速要么为0(无请求进入)要么为一定数值,而令牌桶算法,当某一段时间内无请求进入时,令牌桶堆积满令牌,当下次请求到达时,其可以处理更高数量(桶容量大小)的请求,其承载能力显著高于漏桶法。

限流实现

  • 令牌桶法
public class TokenBucket {

    private int bucketNums = 100; //桶容量
    private int rate = 1;         //流出速率
    private int nowTokens;        //当前令牌数
    private long timestamp=getNowTime(); //上一次获取令牌时间

    private long getNowTime(){
        return System.currentTimeMillis();
    }

    private int min(int tokens){
        if(tokens < bucketNums){
            return tokens;
        }else{
            return bucketNums;
        }
    }

    public boolean getToken(){
        //记录来拿令牌的时间
        long nowTime = getNowTime();

        //System.out.println(timestamp+" "+nowTime);

        //当前的令牌数
        nowTokens =(nowTokens+ (int) (nowTime-timestamp)*rate);
        
        //判断令牌数
        nowTokens = min(nowTokens);
        System.out.println("令牌数: "+nowTokens);
        
        //更新timestamp
        timestamp = nowTime;

        if(nowTokens < 1){
            return false;
        }else{
            nowTokens-=1;
            return true;
        }
    }


    public static void main(String[] args) throws InterruptedException {
        TokenBucket tokenBucket = new TokenBucket();
        for(int i = 0; i < 200; i++){
            if(i == 10){
                Thread.sleep(500);
            }
            System.out.println("第"+i+"次请求结果为:"+tokenBucket.getToken());
        }
    }

}
  • result: 令牌在第113次请求后耗光

令牌桶算法结果.png

  • 存在问题

    nowTokens =(nowTokens+ (int) (nowTime-timestamp)*rate);

在循环体内,仅限当前测试条件下,在Thread.sleep以外的循环时间段内,产生额外令牌,结果存在一定偏差。该实现仅针对一个请求获取一个Token的情况,当前为简单实现,在业务中一般以字节数为对象获取Token,其算法更精确。

Last modification:November 29th, 2019 at 08:22 pm
如果觉得我的文章对你有用,请随意赞赏

One comment

  1. jack

    你可以做个百度统计之类的统计流量OωO

Leave a Comment