gpt4 book ai didi

javascript - node.js 中的大量并行 http 请求

转载 作者:数据小太阳 更新时间:2023-10-29 06:12:09 26 4
gpt4 key购买 nike

我已经创建了一个 node.js 脚本,它扫描网络以查找可用的 HTTP 页面,因此我想并行运行很多连接,但似乎有些请求等待上一个完成。

以下是代码片段:

    var reply = { };
reply.started = new Date().getTime();
var req = http.request(options, function(res) {
reply.status = res.statusCode;
reply.rawHeaders = res.headers;
reply.headers = JSON.stringify(res.headers);
reply.body = '';
res.setEncoding('utf8');
res.on('data', function (chunk) {
reply.body += chunk;
});
res.on('end', function () {
reply.finished = new Date().getTime();
reply.time = reply.finished - reply.started;
callback(reply);
});
});
req.on('error', function(e) {
if(e.message == 'socket hang up') {
return;
}
errCallback(e.message);
});
req.end();

此代码每秒仅执行 10-20 个请求,但我需要 500-1k 请求性能。每个排队的请求都会发送到不同的 HTTP 服务器。

我试过做类似的事情,但没有帮助:

    http.globalAgent.maxSockets = 500;

最佳答案

您的代码一定有其他问题。 Node 每秒可以轻松处理 1k+ 个请求。

我用下面的简单代码进行了测试:

var http = require('http');

var results = [];
var j=0;

// Make 1000 parallel requests:
for (i=0;i<1000;i++) {
http.request({
host:'127.0.0.1',
path:'/'
},function(res){
results.push(res.statusCode);
j++;

if (j==i) { // last request
console.log(JSON.stringify(results));
}
}).end();
}

为了纯粹测试 Node 的能力,而不是我的家庭宽带连接,代码从本地 Nginx 服务器请求。我还避免在所有请求返回之前使用 console.log,因为它是作为同步函数实现的(以避免在程序崩溃时丢失调试消息)。

使用 time 运行代码我得到以下结果:

real    0m1.093s
user 0m0.595s
sys 0m0.154s

1000 个请求需要 1.093 秒,这非常接近每秒 1000 个请求。


如果您尝试发出大量请求(例如 10000 或更多),上面的简单代码将产生操作系统错误,因为 Node 会很乐意尝试在 for 循环中打开所有这些套接字(记住:请求直到for 循环结束,它们只被创建)。您提到您的解决方案也遇到了同样的错误。为避免这种情况,您应该限制您发出的并行请求的数量。

限制并行请求数量的最简单方法是使用 Limit 函数之一,形成 async.js图书馆:

var http = require('http');
var async = require('async');

var requests = [];

// Build a large list of requests:
for (i=0;i<10000;i++) {
requests.push(function(callback){
http.request({
host:'127.0.0.1',
path:'/'
},function(res){
callback(null,res.statusCode);
}).end()
});
}

// Make the requests, 100 at a time
async.parallelLimit(requests, 100,function(err, results){
console.log(JSON.stringify(results));
});

在我的机器上用 time 运行它我得到:

real    0m8.882s
user 0m4.036s
sys 0m1.569s

所以 10k 请求大约需要 9 秒或大约 1.1k/s。

查看 async.js 中可用的函数.

关于javascript - node.js 中的大量并行 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372394/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com