在 Java 中限制传出请求的速率,但使用动态速率
Rate limiting outgoing requests in Java but with a dynamic rate
我正在构建一个应用程序,其中包含 public API 的抓取工具。我想限制我的请求速率,但不是固定速率,而是动态随机速率,它在请求之间变化并落在一定范围内,即我可以设置请求之间的最小和最大延迟。
我也不想阻塞当前线程。
我研究了 Guava Ratelimiter、RatelimitJ 和 Token bucket 算法,但查看文档时,我看不出这些东西如何实现我想要的。
在 250-350 毫秒的速率限制范围内对我的请求产生预期影响的示例:
- 发出请求 #1
- 等待 321 毫秒
- 发出请求 #2
- 等待 259 毫秒
- 发出请求 #3
- 等待 337 毫秒
- ...
您无需查看 JDK 之外的内容。您可以使用 java.util.concurrent.ScheduledExecutorService
在定义的延迟后并在单独的线程中进行调用。要使用它,您需要为执行 API 调用的代码实现 java.util.concurrent.Callable
或 java.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;
我正在构建一个应用程序,其中包含 public API 的抓取工具。我想限制我的请求速率,但不是固定速率,而是动态随机速率,它在请求之间变化并落在一定范围内,即我可以设置请求之间的最小和最大延迟。
我也不想阻塞当前线程。
我研究了 Guava Ratelimiter、RatelimitJ 和 Token bucket 算法,但查看文档时,我看不出这些东西如何实现我想要的。
在 250-350 毫秒的速率限制范围内对我的请求产生预期影响的示例:
- 发出请求 #1
- 等待 321 毫秒
- 发出请求 #2
- 等待 259 毫秒
- 发出请求 #3
- 等待 337 毫秒
- ...
您无需查看 JDK 之外的内容。您可以使用 java.util.concurrent.ScheduledExecutorService
在定义的延迟后并在单独的线程中进行调用。要使用它,您需要为执行 API 调用的代码实现 java.util.concurrent.Callable
或 java.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;