Guava令牌桶

Guava 令牌桶

Guava 是 Google 提供的一个开源 Java 库,RateLimiter 是 Guava 中实现令牌桶限流机制的核心工具。Guava 的令牌桶实现基于 RateLimiter 类,它通过令牌的生成来控制并限制请求的速率,确保系统在一定时间窗口内不会被过多请求淹没,从而起到保护系统和保证服务质量的作用。

Guava 令牌桶的特点

  • 平滑限流:Guava 通过令牌的生成速率来确保流量的平滑度。RateLimiter 默认采用的是“平滑突发限流”(Smooth Bursty),它允许一定的流量突发。

  • 平滑预热限流:Guava 还提供了一种“平滑预热限流”(Smooth Warming Up),当系统启动时,令牌生成速度逐渐增加,适用于服务在冷启动或需要预热阶段的场景。

  • 灵活配置:可以根据实际需求设置令牌的生成速率,并提供灵活的参数配置。

添加依赖

1
2
3
4
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>

RateLimiter 使用

在 onMessage() 消息消费方法中,通过 acquire() 方法可获取令牌,若成功获取了令牌,则正常执行后续代码;如果没有令牌可用,将阻塞,直到获得为止。

搭配 Nacos 动态配置

在生产环境中,服务往往是以集群的方式部署,假设 3 个服务实例构建成一个最基础的集群,数据库每秒能够承受 5000 的并发访问,则平摊到每个服务实例,应该配置为每秒生成 1666 个令牌:

Loading

但是生产环境中,集群的实例数往往随时会发生变动,如果集群压力过大,顶不住目前的流量,运维可能会加机器,比如将 3 实例的集群扩展为 5 实例的集群,那么代码中写死的每秒令牌生成数就不对了,应该变更为 5000 / 5 = 1000,即每秒生成 1000 个令牌,以维持数据库每秒最大能够承受的访问量。

关于每秒生成的令牌数,完全可以添加到 Nacos 配置中心中。


Guava令牌桶
http://bloomivy.github.io/2025/01/23/Guava令牌桶/
作者
Bloom
发布于
2025年1月23日
许可协议