在 N 秒内对 M 个请求进行限制方法调用

2022-08-31 07:21:06

我需要一个组件/类,它将某些方法的执行限制在N秒内最大化M调用(或ms或nanos,没关系)。

换句话说,我需要确保我的方法在N秒的滑动窗口中执行不超过M次。

如果您不了解现有类,请随时发布您的解决方案/想法,您将如何实现这一点。


答案 1

我会使用一个时间戳的环形缓冲区,大小固定为M。每次调用该方法时,您都会检查最旧的条目,如果它在过去少于 N 秒,则执行并添加另一个条目,否则您将因时差而入睡。


答案 2

对我来说开箱即用的是Google Guava RateLimiter

// Allow one request per second
private RateLimiter throttle = RateLimiter.create(1.0);

private void someMethod() {
    throttle.acquire();
    // Do something
}

推荐