1

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

我也不想阻塞当前线程。

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

给定 250-350 毫秒的速率限制范围,对我的请求的预期效果示例:

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

1 回答 1

1

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

    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;
于 2019-06-17T17:53:06.240 回答