【发布时间】:2013-06-28 19:39:23
【问题描述】:
我创建了一个 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;
【问题讨论】:
-
看起来您正在发出 HTTP 请求。是否有可能通过互联网连接快速获得这么多请求?我这里的连接速度非常快,但是我到最近的服务器的 ping 大约是 52 毫秒,我认为这意味着我每秒可以发出大约 20 个 HTTP 请求。
-
我在一台机器上运行这个脚本,我确信可以处理这么多请求。准确地说:它是 hetzner 6s 服务器。
-
当然,但是你读过我说的吗?我认为无论您的机器有多强大,您都无法通过 HTTP 使用单个 Internet 连接发出那么多请求。当您发出 HTTP 请求时,您必须等待来自另一端的响应。您当然可以处理比这更多的请求,但那是因为您将处理来自许多浏览器的请求,每个浏览器都有自己的互联网连接。
-
这里是流行的 http-server 测试工具的输出:#ab -n 10000 -c 1000 srv2.itrack.ru / 每秒请求数:914.94 [#/sec](平均)每个请求的时间:1092.968 [毫秒](平均)
-
那么你是在 node.js 中排队请求吗?等待回复?你必须这样做,因为处理每个请求需要 1 秒,你需要 node.js 中的 914 个活动线程才能使其工作。
标签: javascript node.js http httprequest