[ यह पोस्ट 2012-09-02 (ऊपर से नया) के रूप में अद्यतित है। ]
Node.js बिल्कुल मल्टी-कोर मशीनों पर स्केल करता है।
हां, Node.js एक-धागा-प्रति-प्रक्रिया है। यह एक बहुत ही जानबूझकर किया गया निर्णय है और लॉकिंग शब्दार्थ से निपटने की आवश्यकता को समाप्त करता है। यदि आप इससे सहमत नहीं हैं, तो आप शायद अभी तक महसूस नहीं करते हैं कि बहु-सूत्रित कोड को डीबग करना कितना कठिन है। Node.js प्रक्रिया मॉडल की गहन व्याख्या के लिए और यह इस तरह से काम करता है (और यह कई थ्रेड का समर्थन क्यों करेगा), मेरी अन्य पोस्ट पढ़ें ।
तो मैं अपने 16 कोर बॉक्स का लाभ कैसे उठाऊं?
दो तरीके:
- छवि एन्कोडिंग जैसे बड़े भारी गणना कार्यों के लिए, Node.js बच्चे की प्रक्रियाओं को आग लगा सकते हैं या अतिरिक्त कार्यकर्ता प्रक्रियाओं को संदेश भेज सकते हैं। इस डिजाइन में, आपके पास एक थ्रेड होगा जो घटनाओं और एन प्रक्रियाओं के प्रवाह को प्रबंधित करता है और भारी गणना कार्य करता है और अन्य 15 सीपीयू को चबाता है।
- एक वेबस्पोर्ट पर थ्रूपुट को स्केल करने के लिए, आपको एक बॉक्स पर एक से अधिक Node.js सर्वर चलाने चाहिए, प्रति कोर एक और उनके बीच ट्रैफ़िक अनुरोध को विभाजित करना चाहिए। यह उत्कृष्ट सीपीयू-आत्मीयता प्रदान करता है और मुख्य गणना के साथ लगभग रैखिक रूप से थ्रूपुट को स्केल करेगा।
एक webservice पर स्केलिंग थ्रूपुट
चूंकि v6.0.X Node.js ने क्लस्टर मॉड्यूल को सीधे बॉक्स से बाहर कर दिया है, जिससे कई नोड कर्मचारियों को सेट करना आसान हो जाता है जो एकल पोर्ट पर सुन सकते हैं। ध्यान दें कि यह पुराने LearnBoost "क्लस्टर" के माध्यम से उपलब्ध मॉड्यूल के रूप में ही नहीं है NPM ।
if (cluster.isMaster) {
// Fork workers.
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
} else {
http.Server(function(req, res) { ... }).listen(8000);
}
कार्यकर्ता नए कनेक्शन को स्वीकार करने के लिए प्रतिस्पर्धा करेंगे, और कम से कम भरी हुई प्रक्रिया जीतने की संभावना है। यह बहुत अच्छी तरह से काम करता है और मल्टी-कोर बॉक्स पर थ्रूपुट को अच्छी तरह से स्केल कर सकता है।
यदि आपके पास कई कोर की देखभाल करने के लिए पर्याप्त भार है, तो आप कुछ और चीजें भी करना चाहते हैं:
Nginx या Apache जैसी वेब-प्रॉक्सी के पीछे अपनी Node.js सेवा चलाएं - ऐसा कुछ जो कनेक्शन थ्रॉटलिंग कर सकता है (जब तक कि आप बॉक्स को पूरी तरह से नीचे लाने के लिए अधिभार की स्थिति नहीं चाहते हैं), URL को फिर से लिखें, स्थिर सामग्री परोसें, और प्रॉक्सी अन्य उप-सेवाओं की सेवा लें।
समय-समय पर अपने कार्यकर्ता प्रक्रियाओं को रीसायकल करें। लंबे समय तक चलने वाली प्रक्रिया के लिए, यहां तक कि एक छोटी सी स्मृति रिसाव भी अंततः जोड़ देगा।
लॉग संग्रह / निगरानी सेट करें
पुनश्च: एक और पोस्ट की टिप्पणियों में हारून और क्रिस्टोफर के बीच चर्चा है (इस लेखन के रूप में, इसकी शीर्ष पोस्ट)। उस पर कुछ टिप्पणियां:
- एक साझा सॉकेट मॉडल एक एकल पोर्ट पर कई प्रक्रियाओं को सुनने और नए कनेक्शन स्वीकार करने के लिए प्रतिस्पर्धा करने की अनुमति देने के लिए बहुत सुविधाजनक है। वैचारिक रूप से, आप पूर्वगामी अपाचे के बारे में सोच सकते हैं कि यह महत्वपूर्ण चेतावनी के साथ कर रहा है कि प्रत्येक प्रक्रिया केवल एक ही कनेक्शन को स्वीकार करेगी और फिर मर जाएगी। अपाचे के लिए दक्षता हानि नई प्रक्रियाओं का सामना करने के ओवरहेड में है और सॉकेट संचालन से कोई लेना-देना नहीं है।
- Node.js के लिए, N श्रमिकों का एकल सॉकेट पर प्रतिस्पर्धा करना एक अत्यंत उचित समाधान है। वैकल्पिक है कि नग्नेक्स की तरह एक ऑन-बॉक्स फ्रंट-एंड स्थापित करना है और व्यक्तिगत श्रमिकों के लिए प्रॉक्सी ट्रैफ़िक है, नए कनेक्शन असाइन करने के लिए श्रमिकों के बीच बारी-बारी से। दो समाधानों में बहुत समान प्रदर्शन विशेषताएं हैं। और जब से, जैसा कि मैंने ऊपर उल्लेख किया है, तो आप अपनी नोड सेवा को फिर से शुरू करने के लिए Nginx (या एक वैकल्पिक) का उपयोग करना चाहते हैं, यहाँ चुनाव वास्तव में के बीच है:
साझा पोर्ट: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
बनाम
व्यक्तिगत पोर्ट: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
व्यक्तिगत पोर्ट्स सेटअप के लिए कुछ लाभ हैं (संभावित प्रक्रियाओं के बीच कम युग्मन करने की क्षमता, अधिक परिष्कृत लोड-संतुलन निर्णय, आदि), लेकिन यह निश्चित रूप से सेट अप करने के लिए अधिक काम है और अंतर्निहित क्लस्टर मॉड्यूल कम है -कंपनी विकल्प जो ज्यादातर लोगों के लिए काम करता है।