目前我有一个要求:对API应用速率限制器。如果此API每5秒被调用超过100次,则该API将被阻止10分钟。我不知道是否有任何java库可以满足此要求。如果要求是“每5秒允许100次调用”或“每10分钟允许100次调用”,则我可以使用Bucket4j:
Bandwidth b = Bandwidth.classic(100, Refill.intervally(100, Duration.ofSeconds(5)));
//Bandwidth b = Bandwidth.classic(100, Refill.intervally(100, Duration.ofMinutes(10)));
Bucket bk = Bucket.builder().addLimit(b).build();
//then
if(bk.tryConsume(1)) {
//stuff
} else {
throw
}
或电阻4j:
RateLimiterConfig config = RateLimiterConfig.custom()
.limitRefreshPeriod(Duration.ofSeconds(5))
.limitForPeriod(100)
.timeoutDuration(Duration.ofSeconds(1))
.build();
RateLimiterRegistry rateLimiterRegistry = RateLimiterRegistry.of(config);
RateLimiter rateLimiterWithCustomConfig = rateLimiterRegistry
.rateLimiter("name2", config);
CheckedRunnable restrictedCall = RateLimiter
.decorateCheckedRunnable(rateLimiterWithCustomConfig, this::doStuff);
//then
Try.run(restrictedCall).onFailure(throwable -> throw new RuntimeException());
但要求是“每5秒允许100个呼叫,如果更多,阻止10分钟”。有没有任何lib可以工作?请建议我一个解决方案,为这种情况。谢谢
1条答案
按热度按时间7xllpg7q1#
目前有this feature for
Bucket4j
可以在一段时间内阻塞一个桶。(我可以在Resilence4j
中说同样的话,但我不太确定!)因此,您应该手动维护黑名单。(这将需要更复杂的代码改进,具体取决于用例!)
然而,我认为使用下面两种不同的限制在代码成本方面更好。(您可以保持10分钟的时间段有一定的灵活性,并保持5秒的条件。)
如果我们想把手动列入黑名单作为一个简单的例子;
您可以记录阻塞的时间。然后,您可以编写另一个类来检查何时到达解除阻塞的日期:
第一个