Лучшая практика для выполнения вызовов asyn c api в узле с использованием выборки? - PullRequest
0 голосов
/ 05 мая 2020

Я создаю приложение в nodeJS, express и mysql, где я собираю данные из нескольких разных API: s, используя выборку узлов, один из которых имеет ограничение в 200 вызовов в 5 минут. Чтобы полностью обновить мою базу данных, мне нужно по существу выполнять вызовы этого API без остановок, в настоящее время я пытаюсь не выходить за пределы лимита, используя спящий режим в цикле for / foreach.

Проблема в том, что каждый запрос может меняться по времени, и мне кажется, что я мог бы сделать звонки более эффективными, чем постоянно спать одинаковое количество времени для каждого запроса. Мне было интересно, есть ли способ лучше? Я думал о том, чтобы сделать, например, 199 вызовов asyn c, а затем ждать ровно 5 минут, а затем повторить это ... но я понятия не имею, как.

Не удалось найти тему по этому поводу, но, пожалуйста, сделайте ссылку на один, если уже есть хороший ответ. Мы будем благодарны за ответы, и если у вас есть другие отзывы, дайте мне знать!

  for (let i = 1; i < length; i++) {
    try {
      let id = IdCollection[i];
      let resultFromApiCall = await datafetcher.MakeApiCall(id);

      await sleep(2000);

    } catch (error) {
      console.log("Error in api-calls" + error);
    }
  }```

1 Ответ

0 голосов
/ 05 мая 2020

Думаю, здесь дело вкуса.

Я бы сделал все разрешенные запросы сразу, а затем подождал бы, пока не закончится 5-минутный интервал.

  // constants to define the restrictions
  const restrictionCalls = 5;
  const restrictionTime = 300000; // 5 * 60 * 1000

  let throttleTimer = Date.now(); // when did we start this interval?
  let throttleCounter = 0; // how many calls did we make in this interval?

  for (let i = 1; i < length; i++) {
    try {
      let id = IdCollection[i];
      throttleCounter++;
      let resultFromApiCall = await datafetcher.MakeApiCall(id);
    } catch (error) {
      console.log("Error in api-calls" + error);
    }

    if(throttleCounter === restrictionCalls) {
      const timePassed = Date.now() - throttleTimer;
      const waitTime = restrictionTime - timePassed;
      if(waitTime > 0) await sleep(waitTime);

      // reset
      throttleTimer = Date.now();
      throttleCounter = 0;
    }
  }
...