【问题标题】:Throttling method calls using Guava RateLimiter class使用 Guava RateLimiter 类限制方法调用
【发布时间】:2015-10-31 06:04:37
【问题描述】:

我正在尝试限制每秒调用方法的次数。 我尝试使用 Guava RateLimiter 来实现这一点。

RateLimiter rateLimiter = RateLimiter.create(1.0);//Max 1 call per sec
rateLimiter.acquire();
performOperation();//The method whose calls are to be throttled.

但是调用的方法不限于每秒1个,而是连续的。

可以使用 Thread.sleep() 来实现节流,但我希望使用 Guava 而不是 sleep()。

我想知道使用 Guava RateLimiter 实现方法调用的正确方法。 我检查了 RateLimiter 的文档并尝试使用相同但无法达到预期的结果。

【问题讨论】:

  • 您是否在每次调用之前创建一个新的RateLimiter

标签: java guava throttling


【解决方案1】:

您需要在每次调用中调用同一 RateLimiter 上的 acquire(),例如通过在performOperation() 中提供它:

public class RateLimiterTest {
    public static void main(String[] args) {
        RateLimiter limiter = RateLimiter.create(1.0);
        for (int i = 0; i < 10; i++) {
            performOperation(limiter);
        }
    }

    private static void performOperation(RateLimiter limiter) {
        limiter.acquire();
        System.out.println(new Date() + ": Beep");
    }
}

结果

BST 2015 年 8 月 7 日星期五 19:00:10:哔声
BST 2015 年 8 月 7 日星期五 19:00:11:哔声
2015 年 8 月 7 日星期五 19:00:12 BST:哔声
2015 年 8 月 7 日星期五 19:00:13 BST:哔声
2015 年 8 月 7 日星期五 19:00:14 BST:哔声
2015 年 8 月 7 日星期五 19:00:15 BST:哔声
2015 年 8 月 7 日星期五 19:00:16 BST:哔声
2015 年 8 月 7 日星期五 19:00:17 BST:哔声
2015 年 8 月 7 日星期五 19:00:18 BST:哔声
2015 年 8 月 7 日星期五 19:00:19 BST:哔声

【讨论】:

  • 嗨 Jens 该解决方案运行良好。不过我想要一件事。如果进行的方法调用次数高于指定的速率,它们会被丢弃还是全部按照 RateLimiter 中指定的速率执行?
  • rateLimiter.acquire() 将等待适当的时间,直到需要进行另一项操作。
  • 嗨 sujith,acquire()documentation 声明这是块,因此它们都将以指定的速率执行(此外,如果这样,在我的示例中你不会看到 10 行输出不是这样)
猜你喜欢
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
相关资源
最近更新 更多