слишком быстро отправляются запросы

На одном сайте имеется лимит запросов 60 в минуту, но в моем коде запросы очень быстро отправляются и я не могу нормально их отправлять, какие методы нужны, чтобы настроит время отправки запросов?


Ответы (1 шт):

Автор решения: Ramiz

вот Вам подсказывают в каментах почитать про Thread.sleep - это самый простой способ реализовать Ваше условие.

Thread.sleep(1000L); // ждем секунду перед отправкой запроса, что бы не превысить лимит 60 запросов в минуту.

очевидно, что такой подход весьма не эффективен, т.к. даже если у Вас 1 запрос, он будет ждать целую секунду :)

следующий шаг - запоминать время предыдущего запроса и спать ровно столько сколько нужно. примерно так:

static final long THRESHOLD = 1000L;
static volatile long lastRequestTime;
// ...
synchronized void request() throws Exception {
  long deltaTime = System.currentTimeMillis() - lastRequestTime;
  if(deltaTime < THRESHOLD) {
    Thread.sleep(THRESHOLD - deltaTime);
  }
  executeRequest();
  lastRequestTime = System.currentTimeMillis();
}

в этом случае запросы не будут ждать "вхолостую", но и недостатков остается тоже куча

  • синхронизация
  • блокировка потока
  • обработка ошибок (различать ошибки до и после отправления)

если нужно элегантное решение, то запросы надо посылать асинхронно:

  1. складывать запросы в очередь
  2. читать из очереди в одном потоке с учетом ограничения по частоте

или же залить запросы в Flowable и пропускать их через window, которое будет "выстреливать" по 60 запросов в минуту.

→ Ссылка