【问题标题】:Making 10,000 HTTP Requests Quickly快速发出 10,000 个 HTTP 请求
【发布时间】:2022-01-24 08:40:34
【问题描述】:

我想发出 10,000 个并发 HTTP 请求。我目前正在使用Promise.all 进行操作。但是,我似乎在某种程度上受到速率限制,完成所有 10,000 个请求大约需要 15-30 分钟。 axios 或节点中的 http 请求中是否有限制我的东西?如果有限制,我如何提高限​​制?

const axios = require('axios');

function http_request(url) {
    return new Promise(async (resolve) => {
        await axios.get(url);
        // -- DO STUFF
        resolve();
    });
}

async function many_requests(num_requests) {
    let all_promises = [];
    for (let i = 0; i < num_requests; i++) {
        let url = 'https://someurl.com/' + i;
        let promise = http_request(url);
        all_promises.push(promise);
    }
    return Promise.all(all_promises);
}

async function run() {
    await many_requests(10000);
}

run();

【问题讨论】:

  • 首先,javascript 是单线程的。所以即使我不知道// -- DO STUFF 发生了什么,那肯定会一个接一个地执行。当然,在事件队列中处理 10000 个活动 Promise 会产生一些开销。此外,操作系统可能对开放端口有一些限制。而且后端可能有一些请求限制......
  • 您好,感谢您的回复。做的东西只是重新格式化数据并在本地保存到一个对象中,所以没有什么计算量很大。我明白你所说的关于单线程 JS 的意思,所以除了例如拥有工作脚本并将它们作为子进程分叉(每个进程像 100 个请求)之外,没有真正的解决方案?
  • 您是否尝试过简化代码以帮助找到根本原因?完全删除“做事”。然后确保您正在对端点进行非常简单的 api 调用,该端点允许您快速连续点击 10,000 次。你有这样的端点吗?
  • 10.000 很多。将 10k 与 10ms 相乘,您将获得 1m40s 的 http 调用延迟。 10 毫秒是一个很好的延迟,具体取决于距离,您有 60-100 毫秒的延迟。
  • 这能回答你的问题吗? Lots of parallel http requests in node.js

标签: javascript node.js http axios


【解决方案1】:

在 Node.js 中有两种类型的线程:一种是事件循环(又名 主循环、主线程、事件线程等),以及一个由 k 个 Worker 组成的池 在工作池(又名线程池)中。

...

Node.js 的 Worker Pool 是在 libuv (docs) 中实现的,它 公开一个通用的任务提交 API。

事件循环在一个线程中运行,将任务推送到 k 个工人池中。这些工人将并行运行。池中的默认工作数为 4。您可以设置更多。

source

libuv

默认 UV_THREADPOOLSIZE 为 4。您可以将 UV_THREADPOOLSIZE 设置为链接。它的限制取决于操作系统,您需要检查您的操作系统:

set UV_THREADPOOL_SIZE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多