如何限制/速率限制请求以防止 Axios 出现 429 错误

Posted

技术标签:

【中文标题】如何限制/速率限制请求以防止 Axios 出现 429 错误【英文标题】:How to throttle/rate limit requests to prevent 429 error with Axios 【发布时间】:2020-07-09 12:59:18 【问题描述】:

我正在尝试使用对讲 API 来关闭一组符合特定条件的对话。我使用 Axios 首先调用他们的 API 来获取一组对话 ID,然后我循环这些 ID 并调用他们的 API 来关闭它们。根据他们的文档,它们受到以下限制:

虽然允许的请求限制持续 1 分钟,但我们将其平均分配到 10 秒的窗口中。这意味着每 10 秒,允许的请求数量就会重置。例如,每分钟 1000 的默认速率限制意味着您每 10 秒周期最多可以发送 166 次操作 (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】:

我在另一个线程上找到了一个完美解决这个问题的方法,其中用户使用设置超时发布了一个非常好的解决方案。我在这里应用它:

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`,
        );
      );
    

可以在here找到原始发布的解决方案。

【讨论】:

以上是关于如何限制/速率限制请求以防止 Axios 出现 429 错误的主要内容,如果未能解决你的问题,请参考以下文章

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)

nginx安全:用limit_req_zone/limit_req限制连接速率(流量控制/限流)

aiohttp:限制并行请求的速率

如何限制请求 python 库中 HTTP 请求的下载速率?

Python 请求,如何限制接收大小、传输速率和/或总时间?