【问题标题】:Rate limiting outgoing requests in Java but with a dynamic rate在 Java 中限制传出请求的速率,但具有动态速率
【发布时间】:2019-10-31 05:51:42
【问题描述】:

我正在构建一个包含公共 API 抓取工具的应用程序。我想限制我的请求速率,但不是固定速率,而是动态随机速率,它在请求之间变化并落在一定范围内,即我可以设置请求之间的最小和最大延迟。

我也不想阻塞当前线程。

我研究过 Guava Ratelimiter、RatelimitJ 和 Token bucket 算法,但查看文档,我看不出这些东西是如何实现我想要的。

在 250-350 毫秒的速率限制范围内对我的请求产生预期效果的示例:

  • 提出请求 #1
  • 等待 321 毫秒
  • 提出请求 #2
  • 等待 259 毫秒
  • 提出请求 #3
  • 等待 337 毫秒
  • ...

【问题讨论】:

    标签: java rate-limiting rate ratelimit


    【解决方案1】:

    您无需查看 JDK 之外的内容。您可以使用java.util.concurrent.ScheduledExecutorService 在定义的延迟后并在单独的线程中进行调用。要使用它,您需要为执行 API 调用的代码实现 java.util.concurrent.Callablejava.lang.Runnable

        ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
        Callable apiCaller = ...;
    

    要进行调用以使其在定义的延迟后运行,请按如下方式提交:

        service.schedule(apiCaller, delay, TimeUnit.MILLISECONDS);
    

    要获得随机延迟,您只需使用java.util.Random

            Random random = new Random();
    

    Random 可以为您提供有界整数。因此,如果您将可接受的范围传递给它,然后添加最小值,您将得到一个介于所需最小值和最大值之间的随机数。

       int minimumDelay = 250;
       int maximumDelay = 350;       
       int delay = random.nextInt(maximumDelay - minimumDelay) + minimumDelay;
    

    【讨论】:

      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      相关资源
      最近更新 更多