限制Java中传出请求的速率,但采用动态速率

时间:2019-06-17 15:39:50

标签: java rate-limiting rate ratelimit

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

我也不想阻止当前线程。

我已经研究了番石榴Ratelimiter,RatelimitJ和令牌桶算法,但是在文档中,我看不到任何这些东西都能实现我想要的东西。

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

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

1 个答案:

答案 0 :(得分:0)

您无需查看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();

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

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