【发布时间】:2021-05-28 18:32:40
【问题描述】:
我正在使用 Guava RateLimiter,并且一直在我的代码中创建 ratelimiter,如下所示。
public class RateLimitedCallable<T> implements Callable<T> {
@Override
public T call() {
Boolean permitAcquired = RateLimitTest.rateLimiter.tryAcquire(1, 1000,
TimeUnit.MILLISECONDS);
if (permitAcquired) {
// do stuff
} else {
throw new RuntimeException("Permit was not granted by RateLimiter");
}
}
}
public class RateLimitTest {
public static final RateLimiter rateLimiter = RateLimiter.create(1.0);
public void test() {
RateLimitedCallable<String> callable = new RateLimitedCallable<>();
callable.call();
callable.call();
callable.call();
callable.call();
}
public static void main(String[] args) {
RateLimitTest limiterTest = new RateLimitTest();
limiterTest.test();
}
}
RuntimeException 永远不会被抛出。但是,如果我将超时更改为低于 1000 毫秒的值,例如:-
Boolean permitAcquired = RateLimitTest.rateLimiter.tryAcquire(1, 900, TimeUnit.MILLISECONDS);
我确实看到了 RunTimeException,这意味着速率限制器按预期工作。我不明白为什么当超时时间大于等于 1000 毫秒时速率限制器不强制执行限制。我做错了吗?
【问题讨论】:
标签: java guava throttling rate-limiting