2016-08-26 9 views
6

मैं एक्सप्रेस के साथ एक नोड.जेएस ऐप चला रहा हूं और अपना प्रदर्शन बढ़ाने शुरू करना चाहता हूं। कई मार्ग परिभाषित किए गए हैं। आइए एक मूल उदाहरण है:node.js प्रदर्शन अनुकूलन और एकल थ्रेडेड आर्किटेक्चर

app.get('/users', function (req, res) { 
    User.find({}).exec(function(err, users) { 
     res.json(users); 
    } 
}); 

मान लीजिए कि हमारे पास 3 क्लाइंट ए, बी और सी हैं, जो इस मार्ग का उपयोग करने का प्रयास करते हैं। उनके अनुरोध सर्वर पर ए, बी, सी क्रम में 1 मिलीसेकंद अंतर के साथ आते हैं।

1. यदि मैं node.js आर्किटेक्चर सही ढंग से समझता हूं, तो प्रत्येक अनुरोध तुरंत संभाला जाएगा, क्योंकि Users.find() असीमित है और गैर-अवरुद्ध कोड है?

के एक तुल्यकालिक कॉल के साथ इस उदाहरण का विस्तार करते हैं:

app.get('/users', function (req, res) { 
     var parameters = getUserParameters(); 

     User.find({parameters}).exec(function(err, users) { 
      res.json(users); 
     } 
    }); 

एक ही अनुरोध, उसी क्रम। getUserParameters() पूरा करने के लिए 50 मिलीसेकंड लेता है।

2. ए रूट कॉलबैक-फ़ंक्शन में प्रवेश करेगा और 50 मिलीसेकंड के लिए node.js धागा को ब्लॉक करेगा। बी और सी समारोह में प्रवेश करने में सक्षम नहीं होंगे और प्रतीक्षा करनी होगी। जब कोई getUsersParameters() समाप्त करता है तो यह एसिंक्रोनस User.find() फ़ंक्शन के साथ जारी रहेगा और बी अब रूट कॉलबैक-फ़ंक्शन दर्ज करेगा। सी को अभी भी 50 और मिलीसेकंड का इंतजार करना होगा। जब बी एसिंक्रोनस फ़ंक्शन में प्रवेश करता है, तो सी के अनुरोधों को अंततः संभाला जा सकता है। एक साथ लिया गया: सी को खत्म करने के लिए 50 मिलीसेकंड का इंतजार करना है, बी के लिए 50 मिलीसेकंड खत्म करने के लिए 50 मिलीसेकंड और खुद को समाप्त करने के लिए 50 मिलीसेकंड (सादगी के लिए, हम एसिंक्रोनस फ़ंक्शन के लिए प्रतीक्षा समय को अनदेखा करते हैं)?

अब मानते हैं कि हमारे पास एक और मार्ग है, जो केवल एक व्यवस्थापक द्वारा सुलभ है और हर मिनट क्रोंटब के माध्यम से बुलाया जाएगा।

app.get('/users', function (req, res) { 
    User.find({}).exec(function(err, users) { 
     res.json(users); 
    } 
}); 

app.get('/admin-route', function (req, res) { 
    blockingFunction(); // this function takes 2 seconds to complete 
}); 

3. जब एक अनुरोध एक्स हिट admin-route और blockingFunction() कहा जाता है, होगा ए, बी और सी, कौन सही एक्स के अनुरोध के बाद /users फोन करेगा, जब तक वे भी मार्ग कॉलबैक-समारोह में प्रवेश 2 सेकंड प्रतीक्षा करने के लिए है ?

4. क्या हमें प्रत्येक स्वयं परिभाषित फ़ंक्शन बनाना चाहिए, भले ही इसमें केवल 4 मिलीसेकंड हों, कॉलबैक के साथ एक असीमित फ़ंक्शन के रूप में?

+0

इस सवाल का अप्रासंगिक लेकिन मैंने सुना है एक्सप्रेस मर चुका है। – WitVault

+0

नोड/जेएस में 'अवरोधन समारोह' क्या होगा? अफैक, सब कुछ घटना लूप के आसपास मॉडलिंग किया गया है। – Tobias

उत्तर

6

उत्तर "हां" है, # 3 पर: ब्लॉकिंग का मतलब घटना लूप को अवरुद्ध करना है, जिसका अर्थ है कि कोई भी I/O (HTTP अनुरोध को संभालने की तरह) अवरुद्ध कर दिया जाएगा। इस मामले में, ऐप उन 2 सेकंड के लिए अनुत्तरदायी प्रतीत होगा।

हालांकि, अगर आप तुल्यकालिक कोड के लिए बहुत जंगली काम करने के लिए 2 सेकंड (या तो बहुत भारी गणना, या fs तरह मॉड्यूल द्वारा प्रदान की *Sync() तरीकों का एक बहुत का उपयोग करके) ले जाना है। यदि आप वास्तव में उस कोड को असीमित नहीं बना सकते हैं, तो आपको इसे एक अलग प्रक्रिया में चलाने पर विचार करना चाहिए।

# 4 के बारे में: यदि आप इसे आसानी से असीमित बना सकते हैं, तो आपको शायद चाहिए। हालांकि, बस आपके सिंक्रोनस फ़ंक्शन को कॉलबैक स्वीकार करने से चमत्कारिक रूप से इसे अतुल्यकालिक बना दिया जाता है। यह इस बात पर निर्भर करता है कि समारोह क्या करता है, और कैसे, आप इसे async बना सकते हैं।

0

ग्राउंड सिद्धांत सीपीयू को लॉक कर रहा है (उदाहरण के लिए लूप के लिए लंबे समय तक चल रहा है) या I/O का उपयोग करने वाली कुछ भी या नेटवर्क अतुल्यकालिक होना चाहिए।आप नोड जेएस से सीपीयू-गहन तर्क को बाहर ले जाने पर भी विचार कर सकते हैं, शायद जावा/पायथन मॉड्यूल में जो वेब सेवा को उजागर करता है जो जेएस को कॉल कर सकता है।

एक तरफ के रूप में, इस मॉड्यूल पर नज़र डालें (शायद उत्पादन तैयार न हो)। यह NodeJS में बहु सूत्रण की अवधारणा का परिचय: https://www.npmjs.com/package/webworker-threads

0

# 3 हाँ

# 4 Node.js async प्रोग्रामिंग के लिए है और इसलिए इसके प्रदर्शन में आश्चर्य से बचने के लिए

इस बीच इस दृष्टिकोण का पालन करने के लिए अच्छा आप, अपने ऐप के प्रदर्शन और थ्रूपुट को बेहतर बनाने के लिए Node.js के cluster मॉड्यूल का उपयोग कर सकते हैं।

0

आपको अपने एप्लिकेशन को लंबवत पहले स्केल करने की आवश्यकता हो सकती है। Node.js क्लस्टर मॉड्यूल देखें। आप प्रत्येक कोर पर श्रमिकों को बढ़ाकर मशीन के सभी कोर का उपयोग कर सकते हैं। एक क्लस्टर एक समान श्रमिकों का एक पूल है जो माता-पिता नोड प्रक्रिया के तहत चल रहा है। कार्यकर्ताओं को child_processes मॉड्यूल की कांटा() विधि का उपयोग करके उत्पन्न किया जाता है। इसका मतलब है कि कर्मचारी सर्वर हैंडल साझा कर सकते हैं और माता-पिता नोड प्रक्रिया के साथ संवाद करने के लिए अंतर-प्रक्रिया संचार का उपयोग कर सकते हैं।

var cluster = require('cluster') 
 
var http = require('http') 
 
var os = require('os') 
 
var numCPUs = os.cpus().length 
 

 
if (cluster.isMaster) { 
 
    for (var i = 0; i < numCPUs; i++) { 
 
     cluster.fork() 
 
    } 
 
} else { 
 
    // Define express routes and listen here 
 
}

संबंधित मुद्दे