Ограничение скорости исходящих запросов в Java, но с динамической скоростью - PullRequest
1 голос
/ 17 июня 2019

Я создаю приложение, которое включает в себя скребок публичного API.Я хочу ограничить частоту моих запросов, но не фиксированной, а динамической рандомизированной скоростью, которая меняет промежуточные запросы и попадает в определенный диапазон, т. Е. Я могу установить минимальную и максимальную задержку между запросами.

Я также не хочу блокировать текущий поток.

Я исследовал алгоритм Bucket Ratelimiter, RatelimitJ и Token, но, глядя на документы, я не вижу, как чего-либо из этого можно достичьто, что я хочу.

Пример желаемого эффекта для моих запросов при заданном диапазоне ограничения скорости 250-350 мс:

  • Сделать запрос # 1
  • wait 321 мс
  • Сделать запрос # 2
  • ждать 259 мс
  • Сделать запрос # 3
  • ждать 337 мс
  • ...

1 Ответ

0 голосов
/ 17 июня 2019

Вам не нужно смотреть за пределы JDK.Вы можете использовать java.util.concurrent.ScheduledExecutorService, чтобы сделать вызов после определенной задержки и в отдельном потоке.Чтобы использовать это, вам нужно реализовать java.util.concurrent.Callable или java.lang.Runnable для кода, который вызывает API.

    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;
...