分布式@架构师

限流器的几种实现方案

2021-06-23  本文已影响0人  DayDayUpppppp

整理常见的几种限流算法


两个算法的区别是,无论流量多大,漏桶流出的速率都是固定的。但是令牌桶是可能会出现瞬发大量请求的,比如在令牌桶里面有1000个token,一瞬间来了999个请求,那这些请求是可以被瞬间放过的。令牌桶限流算法的伪代码:

int bucket_token_num = 0

// timer的timeout回调
void rate_limit_timeout()
{
    int add_token = get_add_token_by_cfg();
    bucket_token_num += add_token;
    return;
}

bool rate_limit_bucket_is_empty()
{
    if (bucket_token_num <= 0) {return true;}
    return false;
}

void rate_limit_dec_bucket_token()
{
    assert(!rate_limit_bucket_is_empty());
    bucket_token_num--;
}

// 处理消息的接口
int process_req()
{
    if (!rate_limit_bucket_is_empty())
    {
        rate_limit_dec_bucket_token();
        // do-something
    }
}


相关的一些参考:

  1. https://www.cyhone.com/articles/analisys-of-golang-rate/
  2. https://chai2010.cn/advanced-go-programming-book/ch5-web/ch5-06-ratelimit.html
  3. https://github.com/yangwenmai/ratelimit
  4. https://pandaychen.github.io/2020/09/21/A-DISTRIBUTE-GOREDIS-RATELIMITER-ANALYSIS/
上一篇下一篇

猜你喜欢

热点阅读