Узкое место, похоже, не ограничивает скорость запросов?

Я пишу программу, которая должна перебирать несколько элементов, по очереди выполняя HTTP-запрос GET для каждого элемента. Скорость HTTP-запроса GET ограничена сторонним API до 5 запросов в минуту. Я пытаюсь использовать Узкое место, чтобы ограничить свои запросы к этому API, но без особого успеха.

Минимальный пример моей проблемы выглядит следующим образом:

// index.ts
import * as API from "./lib/API";

(async () => {
  try {
    //Gather all requests
    const list_of_requests = await API.Requests.get_list_of_all_requests(...);

    // Fire off each request at the appropriate rate
    list_of_requests.forEach(async (request) => {
      try {
        const request_result = await API.ResultGetter.get_result(...);

      } catch (error) {
        console.log(error.message);
      }
    });
  } catch (error) {
    console.log(error.name + ": " + error.message);
  }
})();

В моем ./lib/API:

// API.ts
import { AxiosRequestConfig } from "axios";
import { scheduleRequest } from "../util/Limiter";

export async function ResultGetter(...) {
     const requestURL: string = "https://www.website.ext/...";

  const requestConfig: AxiosRequestConfig = {
    url: requestURL,
    method: "GET",
    responseType: "json",
  };

return await scheduleRequest(requestConfig);
}

И, наконец, в моем util/Limiter

// Limiter.ts
import Bottleneck from "bottleneck";
import axios, { AxiosRequestConfig, AxiosResponse } from "axios";

/*
5 API requests per minute; 500 API requests per day
*/
export const limiter = new Bottleneck({
  reservoir: 500, 
  reservoirRefreshAmount: 500,
  reservoirRefreshInterval: 24 * 60 * 60 * 1000,
  maxConcurrent: 1,
  mintime: Math.ceil(1 / (5 / 60 / 1000)),
});

export async function scheduleRequest(
  request: AxiosRequestConfig
): Promise<AxiosResponse<any>> {
  return limiter.schedule(() => axios(request));
}

Однако, когда я действительно использую эту программу, запросы запускаются с максимально возможной скоростью. Я действительно не уверен, что мне не хватает в этом случае. Насколько я понимаю, limiter.schedule(...) должен возвращать обещание, которое разрешается, когда происходит запрос, ограниченное установленным пределом скорости. Но это не то, что здесь происходит.


person Catradora    schedule 27.04.2021    source источник


Ответы (1)


Оказалось, что опечатку найти было сложно.

В моем исходном коде для определения ограничителя скорости у меня было следующее:

export const limiter = new Bottleneck({
  reservoir: 500, 
  reservoirRefreshAmount: 500,
  reservoirRefreshInterval: 24 * 60 * 60 * 1000,
  maxConcurrent: 1,
  mintime: Math.ceil(1 / (5 / 60 / 1000)),
});

Что ж, тот факт, что я написал mintime вместо minTime с заглавной буквы T, имел большое значение в этом мире.

person Catradora    schedule 27.04.2021