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

问题

我需要一个组件/类来限制某些方法的执行到N秒内的最大M次调用(或ms或nanos,无关紧要)。

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

如果你不知道现有的课程,请随时发布你的解决方案/想法如何实现这一点。


#1 热门回答(70 赞)

我使用固定大小为M的时间戳aring buffer。每次调用该方法时,都会检查最旧的条目,如果它在过去的时间内小于N秒,则执行并添加另一个条目,否则你会睡觉区别。


#2 热门回答(66 赞)

对我来说开箱即用的是Google GuavaRateLimiter

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

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

#3 热门回答(27 赞)

具体而言,你应该能够使用aDelayQueue实现此功能。使用M``Delayed实例初始化队列,其延迟最初设置为零。当对该方法的请求进入时,takea令牌会导致该方法阻塞,直到满足限制要求为止。当一个令牌被占用时,adda新令牌到队列,延迟为N