मेरा उपयोग-मामला इस प्रकार है: मैं अपने नोड सर्वर से सार्वजनिक एपीआई में बहुत सी एपीआई कॉल करता हूं। कभी-कभी प्रतिक्रिया बड़ी होती है और कभी-कभी इसका छोटा होता है। मेरा उपयोग-केस मुझे जेएसओएन प्रतिक्रिया को मजबूत करने की मांग करता है। मुझे एक बड़ा JSON पता है क्योंकि प्रतिक्रिया मेरे इवेंट लूप को अवरुद्ध करने जा रही है। कुछ शोधों के बाद मैंने इन प्रतिक्रियाओं को पार्स करने के लिए child_process.fork का उपयोग करने का निर्णय लिया, ताकि अन्य एपीआई कॉलों की प्रतीक्षा न हो। मैंने अपनी मुख्य प्रक्रिया से फोर्क किए गए बच्चे_प्रोसेस में एक बड़ी 30 एमबी जेएसओएन फाइल भेजने की कोशिश की। बच्चे की प्रक्रिया को चुनने और जेसन को पार्स करने में बहुत लंबा समय लगता है। बच्चे की प्रक्रिया से होने वाली प्रतिक्रिया मैं बहुत बड़ी नहीं है। मैं बस स्ट्रिंग करना और लंबाई प्राप्त करना चाहता हूं और मुख्य प्रक्रिया पर वापस भेजना चाहता हूं।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});
});
वहाँ im करने का प्रयास कर क्या हासिल करना एक बेहतर तरीका है? एक तरफ मुझे प्रति सेकंड 1000 एपीआई कॉल करने के लिए node.js की शक्ति की आवश्यकता होती है, लेकिन कभी-कभी मुझे एक बड़ा JSON वापस मिलता है जो चीजों को खराब करता है।
आपका दृष्टिकोण ठीक लगता है। जब आप "मेरा नोड सर्वर" कहते हैं, तो मैं इसे एक प्रक्रिया मानता हूं जो ग्राहकों की सेवा करता है।क्या आपको वास्तव में अपने सर्वर के अंदर से एपीआई कॉल करने की ज़रूरत है? क्या आप कार्य को विभिन्न प्रक्रियाओं में विभाजित नहीं कर सकते हैं और उनके और आपके सर्वर के बीच एक संदेश ब्रोकर, रेडिस, या बस पाइप या आईपीसी के किसी अन्य रूप जैसे संचार चैनल सेट कर सकते हैं? – kliron
मेरा बुरा, इसे सर्वर के रूप में कॉल करने के लिए, आप इसे एजेंट मान सकते हैं। यह किसी की सेवा नहीं कर रहा है। यह एजेंट एक उच्च स्केलेबल एपीआई क्लाइंट के रूप में कार्य करता है। – Vinoth
शायद आप JSON के साथ एक बड़े ब्लॉक में ऐसा करने के बजाय स्ट्रीमिंग जेसन पार्सर का उपयोग कर सकते हैं। – mcfedr