问题
我需要一个组件/类来限制某些方法的执行到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
实例初始化队列,其延迟最初设置为零。当对该方法的请求进入时,take
a令牌会导致该方法阻塞,直到满足限制要求为止。当一个令牌被占用时,add
a新令牌到队列,延迟为N
。