Bucket4J 动态启用或禁用

问题描述 投票:0回答:1

我知道 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 类访问桶的当前容量吗?

谢谢

java rate-limiting bucket bucket4j
1个回答
0
投票

Bucket4j 不提供直接禁用限制的能力。因此,您需要找到一些能够以所需方式近似表现的技巧。

例如,您可以在每次需要取消限制时重新配置(通过replaceConfiguration)具有非常大限制的桶。波纹管是有效无限限制的示例,足以满足通常情况:

 BucketConfiguration infiniteConfiguration =  BucketConfiguration.builder().
                addLimit(Bandwidth.simple(Long.MAX_VALUE, Duration.ofNanos(Long.MAX_VALUE)).
                build();

然后每次需要再次激活限制时,您应该使用常规配置再次重新配置存储桶。

© www.soinside.com 2019 - 2024. All rights reserved.