我们正在实施一个node.js服务器,通常并行获取网页和资产,并将它们保存到s3。似乎非常适合节点。仅供参考我们在aws ebs上运行节点v0.8.25,因为v0.10在ebs上不稳定,我们无法让它可靠地构建。然而,给我们的东西适合的是:#/ p>
Error: connect ECONNRESET
at errnoException (net.js:770:11)
at Object.afterConnect [as oncomplete] (net.js:761:19)
我们开始使用mikeal的请求库,它可以处理303,缓冲和其他细节。现在原型已经完成,我们无法扩展它。在4或5页时,它开始抛出上述错误。我们将globalAgents设置为1,000,将agent(请求池)设置为false,以及许多其他配置选项。没爱。
然后我们做了一些额外的研究,并通过亚组找到了Hyperquest。流式传输很难,因为我们不想指望内容长度标题,但如果它可以扩展,它会愿意放弃它。 Substack有一个漂亮的测试套件,可以将请求与hyperquest进行比较:
请求:
var http = require('http');
var request = require('request');
var startTime = (new Date()).getTime();
var server = http.createServer(function (req, res) {
res.write(req.url.slice(1) + '\n');
setTimeout(res.end.bind(res), 3000);
});
server.listen(5000, function () {
console.log('starting test at ' + (Date.now() - startTime));
var pending = 100;
for (var i = 0; i < 100; i++) {
var r = request('http://localhost:5000/' + i, {pool: false});
r.pipe(process.stdout, { end: false });
r.on('end', function () {
if (--pending === 0) {
server.close();
console.log('ending test at ' + (Date.now() - startTime));
}
});
}
});
process.stdout.setMaxListeners(0); // turn off annoying warnings
Hyperquest:
var http = require('http');
var hyperquest = require('hyperquest');
var startTime = (new Date()).getTime();
var server = http.createServer(function (req, res) {
res.write(req.url.slice(1) + '\n');
setTimeout(res.end.bind(res), 3000);
});
server.listen(5000, function () {
var pending = 200;
for (var i = 0; i < 200; i++) {
var r = hyperquest('http://localhost:5000/' + i);
r.pipe(process.stdout, { end: false });
r.on('end', function () {
if (--pending === 0) server.close();
console.log('ending test at ' + (Date.now() - startTime));
});
}
});
process.stdout.setMaxListeners(0); // turn off annoying warnings
到目前为止一切顺利。 Hyperquest运行时间超过3秒,请求需要12次。然后我们设置http.globalAgent.maxSockets = 1000(或请求中的pool:false),它们都在3.229秒内运行256次请求。
现在这里是真正的问题和问题:如果将待处理请求和循环增加到257或更多,则两个库都会抛出以下错误:
stream.js:81
throw er; // Unhandled stream error in pipe.
^
Error: socket hang up
at createHangUpError (http.js:1379:15)
at Socket.socketCloseListener (http.js:1430:23)
at Socket.EventEmitter.emit (events.js:96:17)
at Socket._destroy.destroyed (net.js:358:10)
at process.startup.processNextTick.process._tickCallback (node.js:245:9)
鉴于256个工作,但不是257,必须有一些系统配置变量需要增加,但我找不到它,需要一个帮助。 ulimit -n是2048,ulimit -a是:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
真的很感激任何帮助!