我知道 Bucket4J 的速率限制器可以动态重新配置,但它可以动态启用/禁用吗?
在我的例子中,如果配置是 0 permits (per seconds),这意味着它被禁用了。在内部,我为桶配置了一个可笑的上限率。
你可以看到下面的代码代码
public void configure(int permitsPerSecond) {
if (permitsPerSecond > 0) {
// Enable rate limit with bucker4j
Refill refill = Refill.intervally(permitsPerSecond, Duration.ofSeconds(1L));
Bandwidth currentLimit = Bandwidth.classic(permitsPerSecond, refill);
BucketConfiguration currentConfiguration = BucketConfiguration.builder().
addLimit(currentLimit).
build();
bucket.replaceConfiguration(currentConfiguration, TokensInheritanceStrategy.RESET);
} else {
// Disable rate limit with ludicrous high rate
BucketConfiguration currentConfiguration = BucketConfiguration.builder().
addLimit(Bandwidth.simple(999_999_999_999L, Duration.ofSeconds(1))).
build();
bucket.replaceConfiguration(DEFAULT_CONFIGURATION,
TokensInheritanceStrategy.RESET);
}
}
public boolean allowExecution() {
return bucket.tryConsume(1L);
}
我尝试搜索文档和代码,期望使用像 bucket.enable(boolean) 和 bucket.getLimit().getCapacty() 这样的方法,但没有成功
还有其他方法可以动态禁用存储桶吗? 另外,我可以从 Bucket 类访问桶的当前容量吗?
谢谢
Bucket4j 不提供直接禁用限制的能力。因此,您需要找到一些能够以所需方式近似表现的技巧。
例如,您可以在每次需要取消限制时重新配置(通过replaceConfiguration)具有非常大限制的桶。波纹管是有效无限限制的示例,足以满足通常情况:
BucketConfiguration infiniteConfiguration = BucketConfiguration.builder().
addLimit(Bandwidth.simple(Long.MAX_VALUE, Duration.ofNanos(Long.MAX_VALUE)).
build();
然后每次需要再次激活限制时,您应该使用常规配置再次重新配置存储桶。