为了账号安全,请及时绑定邮箱和手机立即绑定

在N秒内对M个请求进行节流方法调用

在N秒内对M个请求进行节流方法调用

慕的地8271018 2019-12-09 09:34:34
我需要一个组件/类,该组件/类可在N秒内将某些方法的执行限制为最多M个调用(或ms或nanos,无所谓)。换句话说,我需要确保我的方法在N秒的滑动窗口中执行不超过M次。如果您不知道现有的课程,请随时发布解决方案/想法,以了解如何实现。
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

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


查看完整回答
反对 回复 2019-12-09
?
千巷猫影

TA贡献1829条经验 获得超7个赞

开箱即用的是Google Guava RateLimiter。


// Allow one request per second

private RateLimiter throttle = RateLimiter.create(1.0);


private void someMethod() {

    throttle.acquire();

    // Do something

}


查看完整回答
反对 回复 2019-12-09
?
largeQ

TA贡献2039条经验 获得超7个赞

具体来说,您应该可以使用来实现DelayQueue。使用M Delayed实例初始化延迟为零的实例来初始化队列。当对方法的请求进入时,take令牌将导致方法阻塞,直到满足限制要求为止。取得令牌后,add新令牌以延迟进入队列N。


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 406 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信