限流之Guava RateLimiter

本文介绍了两种常见的限流算法——漏桶和令牌桶,并对比了它们的区别。漏桶算法以恒定速率处理请求,超出则丢弃;令牌桶则允许短时突发流量,控制平均流入速率。GuavaRateLimiter使用令牌桶实现限流,确保请求的平滑处理。若不依赖框架,可以使用简单的原子操作实现基础限流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       限流是保护高并发系统的三把利器之一,另外两个是缓存和降级。

限流基础算法

  • 漏桶算法
    • 流入速度任意。
    • 流出速度固定。
    • 请求到来时,放入队列,出口侧按固定速度消费。
    • 无论积压多少请求,出口侧都按固定速度匀速处理。
    • 队列满时,阻塞、或丢弃。
  • 令牌桶算法。
    • 通过控制令牌生成速度,达到流量平稳。
    • 请求/调用 到达时,从桶拿取令牌,拿不到时,阻塞或丢弃。
    • 若消费方短暂中断,或某个处理比较耗时,而积累了令牌,则可能产生一波突发处理。
  • 二者对比:
    • 漏桶限制的是常量流出速率。
    • 令牌桶限制的是平均流入速率。

Guava RateLimiter

  • RateLimiter使用令牌桶算法,会进行令牌的累积。
  • 令牌的产生是匀速的,若令牌的消耗较快,则整个调用过程也会是平衡的均匀的。
final void doSetRate(double permitsPerSecond, long nowMicros) {
    resync(nowMicros);
    double stableIntervalMicros = SECONDS.toMicros(1L) / permitsPerSecond;
    this.stableIntervalMicros = stableIntervalMicros;
    doSetRate(permitsPerSecond, stableIntervalMicros);
}
  • permitsPerSecond:每秒产生的令牌数。
  • SECONDS.toMicros:将 1 秒转化为毫秒。
  • stableIntervalMicros:生产令牌的稳定间隔毫秒数。

补充:

       如不想使用框架,且对平稳性要求不高,也可用JDK自带工具原生写一个:

try {
    if (atomic.incrementAndGet() > 限流数) {
        // 拒绝请求
    }
    // 处理请求
} finally {
    atomic.decrementAndGet();
}

参考:https://zhuanlan.zhihu.com/p/60979444
https://blog.youkuaiyun.com/l1394049664/article/details/82050066。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值