多くの場合、並行して Web ページとアセットをフェッチし、s3 に保存する node.js サーバーを実装しています。ノードにぴったりのようです。参考までに、v0.10 は ebs では不安定であり、確実にビルドすることができなかったため、aws ebs でノード v0.8.25 を実行しています。しかし、私たちにぴったりのものは古き良きものです:
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 に、エージェント (リクエスト用のプール) を false に設定し、その他の多くの構成オプションを設定しました。愛がない。
その後、追加の調査を行い、サブスタックによって Hyperquest を見つけました。コンテンツの長さのヘッダーを当てにしたくないため、ストリーミングは難しいですが、スケーリングできる場合は喜んで試してみたいと思います。Substack には、リクエストとハイパークエストを比較する気の利いたテスト スイートがあります。
リクエスト:
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
ハイパークエスト:
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 (またはプール: リクエストで false) を設定すると、256 リクエストに対して両方とも 3.229 秒で実行されます。
本当の問題と質問は次のとおりです。保留中のリクエストとループを 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
どんな助けでも本当に感謝します!