计算Google Guava/resilience4j限流器速率值,适配100请求/分钟API限制
计算Guava/Resilience4j限流器速率的方案
核心逻辑
限流速率仅由API的限制规则(每分钟100次请求)决定,总请求量10000次是待处理的任务总量,仅用于预估总耗时(10000/100=100分钟),不影响限流参数的配置。
Google Guava RateLimiter 配置
Guava的RateLimiter以**每秒允许的请求数(permitsPerSecond)**为核心参数,计算公式:
permitsPerSecond = 每分钟请求数 / 60
代入已知值:100/60 ≈ 1.6667(次/秒)
代码示例
平滑突发限流(允许短时间内突发请求)
import com.google.common.util.concurrent.RateLimiter; // 初始化限流器,每秒允许~1.6667个请求(对应每分钟100次) RateLimiter rateLimiter = RateLimiter.create(100.0 / 60); // 每次API请求前获取许可 if (rateLimiter.tryAcquire()) { // 执行API调用逻辑 }
平滑预热限流(适用于需要逐步提升速率的场景)
如果需要设置预热时间(比如10秒内逐步达到限流速率):
RateLimiter rateLimiter = RateLimiter.create(100.0 / 60, 10, TimeUnit.SECONDS);
Resilience4j RateLimiter 配置
Resilience4j限流器基于令牌桶机制,可通过两种方式配置匹配每分钟100次的规则:
方式1:按分钟周期配置(严格每分钟100次,无突发)
直接设置刷新周期为1分钟,周期内允许100次请求:
import io.github.resilience4j.ratelimiter.RateLimiter; import io.github.resilience4j.ratelimiter.RateLimiterConfig; import java.time.Duration; RateLimiterConfig config = RateLimiterConfig.custom() .limitRefreshPeriod(Duration.ofMinutes(1)) .limitForPeriod(100) .build(); RateLimiter rateLimiter = RateLimiter.of("api-limiter", config);
方式2:按秒平滑配置(允许均匀分布请求)
设置每秒填充令牌的速率为100/60 ≈ 1.6667个,令牌桶容量可根据是否允许突发调整:
import io.github.resilience4j.ratelimiter.RateLimiter; import io.github.resilience4j.ratelimiter.RateLimiterConfig; import io.github.resilience4j.ratelimiter.TokenBucketConfig; RateLimiterConfig config = RateLimiterConfig.custom() .tokenBucketConfig(TokenBucketConfig.custom() .tokenRate(100.0 / 60) // 每秒填充~1.6667个令牌 .capacity(100) // 桶容量,允许最多突发100次请求(若API支持) .build()) .build(); RateLimiter rateLimiter = RateLimiter.of("api-limiter", config);
内容的提问来源于stack exchange,提问作者Jumbolemming
相关产品推荐
相关产品推荐

