Как ограничить / ограничить скорость запросов, чтобы предотвратить ошибку 429 с Axios - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь использовать Интерком API, чтобы закрыть массив разговоров, которые соответствуют определенным критериям. Я использую Ax ios, чтобы сначала вызвать их API, чтобы получить массив идентификаторов разговоров, затем я перебираю эти идентификаторы и вызываю их API, чтобы закрыть их. Согласно их документации, они ограничены следующим:

Хотя разрешенный лимит запросов длится 1 минуту, мы равномерно распределяем его на 10 секунд windows. Это означает, что каждые 10 секунд количество разрешенных запросов сбрасывается. Например, ограничение скорости по умолчанию 1000 в минуту означает, что вы можете отправить максимум 166 операций за 10-секундный период (1000/6)

Я пытался использовать P-Limit, и это позволило для более успешных запросов, прежде чем в конечном итоге получить 429. Есть ли хорошее решение для регулирования запросов в соответствии с критериями, установленными в их документации?

Это была моя попытка использовать PLimit. Для краткости я пропустил блок кода для первого обещания:

const listOfConversations = [];

        axios
          .post(searchUrl, searchBodyParameters, config)
          .then((response) => {...
    .then(() => {
            const promises = [];
            listOfConversations.forEach((conversation) => {
              const p = axios
                .post(
                  `https://api.intercom.io/conversations/${conversation}/parts`,
                  closeBodyParameters,
                  config,
                )
                .catch((error) => {
                  console.log(
                    `Error. Failed to close conversations. Server Returned - ${error.response.status}`,
                  );
                });
              promises.push(limit(() => p));
            });
          })
          .catch((error) => {
            console.log(
              `Error. Failed to get number of pages. Server Returned - ${error.response.status}`,
            );
          });

1 Ответ

0 голосов
/ 07 апреля 2020

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

const listOfConversations = [];

        axios
          .post(searchUrl, searchBodyParameters, config)
          .then((response) => {...
    .then(() => {
        const interval = 70;
        let promise = Promise.resolve();
        listOfConversations.forEach((conversation) => {
        promise = promise.then(() => {
          axios.post(
            `https://api.intercom.io/conversations/${conversation}/parts`,
            closeBodyParameters,
            config,
          )
          .catch((error) => {
            console.log(
              `Error. Failed to close conversations. Server Returned - ${error.response.status}`,
            );
          })
          return new Promise((resolve) => {
            setTimeout(resolve, interval);
          })
        })
        });
      })
      .catch((error) => {
        console.log(
          `Error. Failed to get number of pages. Server Returned - ${error.response.status}`,
        );
      });
    }

Исходное опубликованное решение можно найти здесь .

...