net.Server
TCP ソケットでレガシー システムをリッスンするノードがあります。メッセージを受信すると、別の http サーバーに http 要求を送信します。簡略化すると、次のようになります。
var request = require('request-promise');
...
socket.on('readable', function () {
var msg = parse(socket.read());
var postOptions = {
uri: 'http://example.com/go',
method: 'POST',
json: msg,
headers: {
'Content-Type': 'application/json'
}
};
request(postOptions);
})
問題は、ソケットが毎秒約 1000 回読み取り可能であることです。要求は、http サーバーを過負荷にします。ほとんどすぐに、数秒の応答時間が得られます。
Apache ベンチマークを実行すると、同時要求数を約 100 に制限した場合、http サーバーが 100 ミリ秒未満の応答時間で 1 秒あたり 1000 をはるかに超える要求を処理できることは明らかです。
だから私の質問は、イベント コールバック内で各リクエストが個別に起動されたときに、 request-promise
(拡張子、、request
および) ライブラリを使用して未処理の同時リクエストを制限する最良の方法は何ですか?core.http.request
リクエストのドキュメントには次のように記載されています。
ループ内で複数のリクエストを送信し、複数の新しいプール オブジェクトを作成している場合、
maxSockets
意図したとおりに機能しないことに注意してください。これを回避するには、プール オプションで request.defaults を使用するかmaxSockets
、ループの外でプロパティを使用してプール オブジェクトを作成します。
この段落が私の問題に対する答えを教えてくれていると確信していますが、それを理解することはできません. デフォルトを使用して、開いているソケットの数を制限しています。
var rp = require('request-promise');
var request = rp.defaults({pool: {maxSockets: 50}});
これは役に立ちません。現時点ではキューを手動で管理することしか考えていませんが、従来の方法を知っていれば不要になると思います。