Myユースケースは次のとおりです。 私のノードサーバーからパブリックAPIにたくさんの残りのAPI呼び出しを行います。時折レスポンスが大きくて、時には小さいです。私のユースケースでは、JSONの応答を文字列化する必要があります。応答がイベントループをブロックするため、大きなJSONを認識しています。いくつかの研究の後、child_process.forkを使用してこれらの応答を解析し、他のAPI呼び出しを待つ必要がないようにしました。私は、メインプロセスからforked child_processに大きな30 MBのJSONファイルを送信しようとしました。子プロセスがjsonを選択して解析するのに時間がかかります。子プロセスからの応答は巨大ではありません。私はちょうどストリングし、長さを取得し、メインプロセスに返信したい。Node.js - child_processに大きなオブジェクトを送信するのが遅い
マスターとチャイルドコードを添付します。
var moment = require('moment');
var fs = require('fs');
var process = require('child_process');
var request = require('request');
var start_time = moment.utc().valueOf();
request({url: 'http://localhost:9009/bigjson'}, function (err, resp, body) {
if (!err && resp.statusCode == 200) {
console.log('Body Length : ' + body.length);
var ls = process.fork("response_handler.js", 0);
ls.on('message', function (message) {
console.log(moment.utc().valueOf() - start_time);
console.log(message);
});
ls.on('close', function (code) {
console.log('child process exited with code ' + code);
});
ls.on('error', function (err) {
console.log('Error : ' + err);
});
ls.on('exit', function (code, signal) {
console.log('Exit : code : ' + code + ' signal : ' + signal);
});
}
ls.send({content: body});
});
response_handler.js
console.log("Process " + process.argv[2] + " at work ");
process.on('message', function (json) {
console.log('Before Parsing');
var x = JSON.stringify(json);
console.log('After Parsing');
process.send({msg: 'Sending message from the child. total size is' + x.length});
});
やろうと何イム達成するためのより良い方法はありますか?一方で、私はnode.jsの力で毎秒1000回のAPI呼び出しを行う必要がありますが、時にはJSONのバックを取得してしまうこともあります。
あなたのアプローチはうまくいくようです。あなたが「私のノードサーバー」と言うとき、私はそれがクライアントに役立つプロセスであると理解しています。あなたは本当にあなたのサーバーの内部からAPI呼び出しを行う必要がありますか?あなたはタスクを異なるプロセスに委任することはできませんし、それらとメッセージブローカーRedisのようなサーバーとの間の通信チャネルを設定することはできませんか?単にパイプやIPCの他の形式ですか? – kliron
私は悪いですが、これをサーバーとして呼び出すためには、これをエージェントと見なすことができます。これは誰にも役立たない。このエージェントは、スケーラビリティの高いAPIクライアントとして機能します。 – Vinoth
JSONを使って1つの大きなブロックでストリーミングするのではなく、ストリーミングJSONパーサーを使用することができます。 – mcfedr