मैं काम पर Node.js का उपयोग करता हूं, और इसे बहुत शक्तिशाली मानता हूं। Node.js का वर्णन करने के लिए एक शब्द चुनने के लिए मजबूर, मैं "दिलचस्प" (जो एक शुद्ध सकारात्मक विशेषण नहीं है) कहूंगा। समुदाय जीवंत और विकसित हो रहा है। जावास्क्रिप्ट, इसकी विषमताओं के बावजूद कोड करने के लिए एक महान भाषा हो सकती है और आप "सर्वोत्तम अभ्यास" और अच्छी तरह से संरचित कोड के पैटर्न के बारे में अपनी खुद की समझ को फिर से पढ़ेंगे। इस समय Node.js में विचारों की भारी ऊर्जा बह रही है, और इसमें काम करना आपको इस सभी सोच - महान मानसिक भारोत्तोलन में उजागर करता है।
उत्पादन में Node.js निश्चित रूप से संभव है, लेकिन "टर्न-की" तैनाती से दूर प्रलेखन द्वारा उचित रूप से वादा किया गया है। Node.js v0.6.x के साथ, "क्लस्टर" को आवश्यक बिल्डिंग ब्लॉक्स में से एक प्रदान करते हुए, प्लेटफ़ॉर्म में एकीकृत किया गया है, लेकिन मेरी "प्रोडक्शन.जेएस" स्क्रिप्ट अभी भी है ~ लॉजिक को संभालने के लिए सामान को संभालने के लिए लॉजिक की 150 लाइनें निर्देशिका, मृत श्रमिकों को पुनर्चक्रण करना, आदि "गंभीर" उत्पादन सेवा के लिए, आपको आने वाले कनेक्शनों को थ्रॉटल करने के लिए भी तैयार रहना होगा और अपाचे पीएचपी के लिए वह सभी सामान करना होगा । निष्पक्ष होने के लिए, रूबी ऑन रेल्स में यह सटीक समस्या है। इसे दो पूरक तंत्रों के माध्यम से हल किया गया है: 1) रूबी को पटरियों / नोड पर रखना।अपाचे / लाइटड )। वेबसर्वर कुशलतापूर्वक स्थिर सामग्री, पहुँच लॉगिंग, URL को फिर से लिखना, SSL को समाप्त करना, पहुँच नियमों को लागू करना और कई उप-सेवाओं का प्रबंधन कर सकता है। वास्तविक नोड सेवा को हिट करने वाले अनुरोधों के लिए, वेबसर्वर अनुरोध के माध्यम से प्रॉक्सी करता है। 2) यूनिकॉर्न की तरह एक फ्रेमवर्क का उपयोग करना जो श्रमिक प्रक्रियाओं का प्रबंधन करेगा, उन्हें समय-समय पर रीसायकल करेगा, आदि मुझे अभी तक एक नोड.जेएस सेवारत ढांचे की तलाश करना है जो पूरी तरह से पके हुए लगते हैं; यह मौजूद हो सकता है, लेकिन मुझे यह अभी तक नहीं मिला है और अभी भी मेरे हाथ से लुढ़के "प्रोडक्शन.जेएस" में ~ 150 लाइनों का उपयोग करते हैं।
एक्सप्रेस जैसे फ्रेमवर्क पढ़ना ऐसा लगता है कि मानक अभ्यास केवल एक जैक-ऑफ-ऑल-ट्रेड्स Node.js सेवा के माध्यम से सब कुछ परोसना है ... "app.use (express.static (__ dirname + '/ public'))" । कम-लोड सेवाओं और विकास के लिए, यह शायद ठीक है। लेकिन जैसे ही आप अपनी सेवा पर बड़े समय का भार डालने की कोशिश करते हैं और इसे 24/7 चलाते हैं, आप जल्दी से उन प्रेरणाओं की खोज करेंगे जो बड़ी साइटों को अच्छी तरह से बेक करने के लिए प्रेरित करती हैं, कठोर सी कोड जैसे नग्नेक्स ने अपनी साइट का मोर्चा संभाला और सभी को संभाला स्थिर सामग्री अनुरोधों (... जब तक आप CDN सेट नहीं करते , जैसे Amazon CloudFront ))। कुछ हद तक हास्य और अनभिज्ञता से नकारात्मक इस पर ले, इस आदमी को देखें ।
Node.js भी अधिक से अधिक गैर-सेवा उपयोग ढूंढ रहा है। आप कुछ और प्रयोग कर रहे हैं यहां तक कि अगर वेब सामग्री की सेवा के लिए, आप अभी भी Node.js निर्माण उपकरण के रूप में, का उपयोग कर सकते का उपयोग कर NPM मॉड्यूल अपने कोड को व्यवस्थित करने, Browserify एक भी परिसंपत्ति में यह सिलाई, और करने के लिए सूरत बिगाड़ना-js तैनाती के लिए यह कम करें करने के लिए । वेब से निपटने के लिए, जावास्क्रिप्ट एक पूर्ण प्रतिबाधा मैच है और अक्सर यह हमले का सबसे आसान मार्ग बनाता है। उदाहरण के लिए, यदि आप JSON रिस्पॉन्स पेलोड के एक समूह के माध्यम से बजना चाहते हैं, तो आपको मेरे अंडरस्कोर-सीएलआई मॉड्यूल, संरचित डेटा की उपयोगिता-बेल्ट का उपयोग करना चाहिए ।
फायदे नुकसान:
- प्रो: एक सर्वर आदमी के लिए, बैकएंड पर जावास्क्रिप्ट लिखना आधुनिक यूआई पैटर्न सीखने के लिए "गेटवे ड्रग" रहा है। मैं अब क्लाइंट कोड लिखने से नहीं डरता।
- प्रो: उचित त्रुटि जाँच को प्रोत्साहित करने के लिए जाता है (इरेट को लगभग सभी कॉलबैक द्वारा वापस कर दिया जाता है, प्रोग्रामर को इसे संभालने के लिए सताते हैं; साथ ही, async.js और अन्य लाइब्रेरीज़ "इन सब में से कोई भी सबस्टिट्यूट विफल होने पर संभालती हैं" को बेहतर तरीके से समकालिक कोड की तुलना में बेहतर बनाता है। )
- प्रो: कुछ दिलचस्प और सामान्य रूप से कठिन कार्य तुच्छ हो जाते हैं - जैसे उड़ान में कार्यों पर स्थिति प्राप्त करना, श्रमिकों के बीच संवाद करना या कैश स्टेट साझा करना
- प्रो: एक ठोस पैकेज प्रबंधक (npm) के आधार पर विशाल समुदाय और महान पुस्तकालयों के टन
- Con: जावास्क्रिप्ट में कोई मानक पुस्तकालय नहीं है। आप कार्यक्षमता का आयात करने के लिए इतने अभ्यस्त हो जाते हैं कि जब आप JSON.parse या किसी अन्य विधि का उपयोग करते हैं तो यह अजीब लगता है जिसमें npm मॉड्यूल को जोड़ने की आवश्यकता नहीं होती है। इसका मतलब है कि सब कुछ के पांच संस्करण हैं। यहां तक कि नोड.जेएस "कोर" में शामिल मॉड्यूल के पांच और संस्करण हैं, जिन्हें आपको डिफ़ॉल्ट कार्यान्वयन से नाखुश होना चाहिए। यह तेजी से विकास की ओर जाता है, लेकिन भ्रम के कुछ स्तर भी।
एक सरल एक-प्रक्रिया-प्रति-अनुरोध मॉडल ( LAMP ) बनाम :
- प्रो: हजारों सक्रिय कनेक्शन के लिए स्केलेबल। बहुत तेज और बहुत कुशल। एक वेब बेड़े के लिए, इसका मतलब हो सकता है कि PHP या रूबी बनाम आवश्यक बक्से की संख्या में 10X की कमी हो
- प्रो: समानांतर पैटर्न लिखना आसान है। कल्पना कीजिए कि आप से तीन (या एन) धब्बे लाने की जरूरत है Memcached । PHP में ऐसा करें ... क्या आपने अभी कोड लिखा है पहला ब्लॉब, फिर दूसरा, फिर तीसरा? वाह, यह धीमी है। Memcached के लिए उस विशिष्ट समस्या को ठीक करने के लिए एक विशेष PECL मॉड्यूल है, लेकिन क्या होगा यदि आप अपने डेटाबेस क्वेरी के साथ समानांतर में कुछ Memcached डेटा प्राप्त करना चाहते हैं? Node.js में, क्योंकि प्रतिमान अतुल्यकालिक है, एक वेब अनुरोध करते हुए समानांतर में कई चीजें करना बहुत स्वाभाविक है।
- Con: एसिंक्रोनस कोड, सिंक्रोनस कोड की तुलना में मौलिक रूप से अधिक जटिल है, और अप-फ्रंट लर्निंग कर्व डेवलपर्स के लिए कठिन हो सकता है, जो कि समवर्ती निष्पादन का वास्तव में मतलब है की ठोस समझ के बिना। फिर भी, लॉकिंग के साथ किसी भी प्रकार के मल्टीथ्रेडेड कोड लिखने की तुलना में यह बहुत कम मुश्किल है।
- Con: यदि एक कम्प्यूट-गहन अनुरोध, उदाहरण के लिए, 100 ms चलता है, तो यह अन्य अनुरोधों के प्रसंस्करण को रोक देगा, जिन्हें एक ही Node.js प्रक्रिया में संभाला जा रहा है ... AKA, सहकारी-मल्टीटास्किंग । यह वेब वर्कर्स पैटर्न (महंगे कार्य से निपटने के लिए एक उपप्रकार बंद करने) के साथ कम किया जा सकता है। वैकल्पिक रूप से, आप बड़ी संख्या में Node.js श्रमिकों का उपयोग कर सकते हैं और केवल प्रत्येक को एक ही अनुरोध को समवर्ती रूप से संभालने दें (अभी भी काफी कुशल है क्योंकि कोई प्रक्रिया रीसायकल नहीं है)।
- Con: एक उत्पादन प्रणाली चलाना MUCH है जो Apache + PHP, Perl , Ruby , आदि जैसे CGI मॉडल की तुलना में अधिक जटिल है । अनचाहे अपवाद पूरी प्रक्रिया को नीचे लाएंगे, असफल श्रमिकों को पुनरारंभ करने के लिए तर्क की आवश्यकता होगी ( क्लस्टर देखें )। छोटी गाड़ी मूल कोड के साथ मॉड्यूल प्रक्रिया को हार्ड-क्रैश कर सकते हैं। जब भी किसी कार्यकर्ता की मृत्यु होती है, तो उसके द्वारा किए गए किसी भी अनुरोध को हटा दिया जाता है, इसलिए एक छोटी सी एपीआई आसानी से अन्य cohosted API के लिए सेवा को नीचा दिखा सकती है।
जावा / सी # / सी (सी? वास्तव में?) में "वास्तविक" सेवा लिखने वाला बनाम?
- प्रो: Node.js में एसिंक्रोनस करना कहीं भी थ्रेड-सेफ्टी करने की तुलना में आसान है और यकीनन अधिक लाभ प्रदान करता है। Node.js अब तक सबसे कम दर्दनाक अतुल्यकालिक प्रतिमान है, जिसमें मैंने कभी काम किया है। अच्छे पुस्तकालयों के साथ, यह तुल्यकालिक कोड लिखने से थोड़ा कठिन है।
- प्रो: कोई मल्टीथ्रेडिंग / लॉकिंग बग नहीं। सच है, आप अधिक वर्बोज़ कोड लिखने में सामने निवेश करते हैं जो एक उचित एसिंक्रोनस वर्कफ़्लो को व्यक्त करता है जिसमें कोई अवरोधक संचालन नहीं होता है। और आपको कुछ परीक्षण लिखने और काम करने की चीज़ प्राप्त करने की आवश्यकता है (यह एक स्क्रिप्टिंग भाषा है और वसा वाले चर नाम केवल इकाई-परीक्षण के समय पकड़े जाते हैं)। लेकिन, एक बार जब आप इसे काम करने के लिए प्राप्त करते हैं, तो हाइजेनबग्स के लिए सतह क्षेत्र - अजीब समस्याएं जो केवल एक लाख रन में एक बार प्रकट होती हैं - वह सतह क्षेत्र बस बहुत कम है। Node.js कोड लिखने वाले कर कोडिंग चरण में भारी रूप से सामने होते हैं। तब आप स्थिर कोड के साथ समाप्त होते हैं।
- प्रो: कार्यक्षमता को व्यक्त करने के लिए जावास्क्रिप्ट बहुत अधिक हल्का है। इसे शब्दों के साथ साबित करना मुश्किल है, लेकिन JSON , डायनेमिक टाइपिंग, लंबोदर नोटेशन, प्रोटोटाइप इनहेरिटेंस, लाइटवेट मॉड्यूल, जो भी हो ... यह केवल समान विचारों को व्यक्त करने के लिए कम कोड लेने के लिए जाता है।
- Con: शायद तुम सच में, वास्तव में जावा में कोडिंग सेवाओं की तरह?
जावास्क्रिप्ट और Node.js पर एक और परिप्रेक्ष्य के लिए, Java से Node.js तक की जाँच करें , जावा डेवलपर के इंप्रेशन पर एक ब्लॉग पोस्ट और Node.js. को सीखने का अनुभव।
मॉड्यूल
नोड पर विचार करते समय, ध्यान रखें कि जावास्क्रिप्ट पुस्तकालयों की आपकी पसंद आपके अनुभव को परिभाषित करेगी । ज्यादातर लोग कम से कम दो, एक एसिंक्रोनस पैटर्न हेल्पर (स्टेप, फ्यूचर्स, एसक्यूएन), और एक जावास्क्रिप्ट चीनी मॉड्यूल ( अंडरस्कोर.जेएस ) का उपयोग करते हैं।
हेल्पर / जावास्क्रिप्ट चीनी:
- Underscore.js - इसका उपयोग करें। बस कर दो। यह आपके कोड को _.isString (), और _.isArray () जैसे सामान के साथ अच्छा और पठनीय बनाता है। मुझे यकीन नहीं है कि आप सुरक्षित कोड कैसे लिख सकते हैं अन्यथा नहीं। इसके अलावा, बढ़ी हुई कमांड-लाइन-फू के लिए, मेरे अपने अंडरस्कोर-सीएलआई की जांच करें ।
अतुल्यकालिक पैटर्न मॉड्यूल:
- चरण - धारावाहिक और समानांतर कार्यों के संयोजन को व्यक्त करने का एक बहुत ही सुरुचिपूर्ण तरीका। मेरी व्यक्तिगत प्रतिपूर्ति। स्टेप कोड कैसा दिखता है, इस पर मेरी पोस्ट देखें ।
- वायदा - आवश्यकताओं के माध्यम से आदेश व्यक्त करने का तरीका बहुत अधिक लचीला (क्या यह वास्तव में एक अच्छी बात है?)। समानांतर "ए, बी, सी, और बी फिनिश, एबी शुरू करें। ए, और सी खत्म, एसी शुरू करें।" जैसी चीजों को व्यक्त कर सकते हैं। इस तरह के लचीलेपन के लिए आपके वर्कफ़्लो में बग्स से बचने के लिए अधिक देखभाल की आवश्यकता होती है (जैसे कॉलबैक को कभी कॉल न करना, या कई बार कॉल करना)। वायदा का उपयोग करने के बारे में रेन्नोस की पोस्ट देखें (यह वह पोस्ट है जिसने मुझे "वायदा" मिल गया)।
- Async - प्रत्येक पैटर्न के लिए एक विधि के साथ अधिक पारंपरिक पुस्तकालय। मैंने अपने धार्मिक रूपांतरण से पहले कदम और बाद में यह महसूस किया कि Async में सभी पैटर्न एक और अधिक पठनीय प्रतिमान के साथ चरण में व्यक्त किए जा सकते हैं।
- TameJS - OKCupid द्वारा लिखित, यह एक प्री - कंपाइलर है , जो सुरुचिपूर्ण ढंग से धारावाहिक और समानांतर वर्कफ़्लोज़ लिखने के लिए एक नई भाषा "प्रतीक्षा" जोड़ता है। पैटर्न आश्चर्यजनक दिखता है, लेकिन इसके लिए पूर्व-संकलन की आवश्यकता होती है। मैं अभी भी इस पर अपना मन बना रहा हूं।
- StreamlineJS - TameJS के प्रतियोगी। मैं टेम की ओर झुक रहा हूं, लेकिन आप अपना मन बना सकते हैं।
या अतुल्यकालिक पुस्तकालयों के बारे में सब पढ़ने के लिए, लेखकों के साथ इस पैनल-साक्षात्कार को देखें ।
वेब फ्रेमवर्क:
- वेब साइटों के आयोजन के लिए रेल-एसके ढांचे पर ग्रेट रूबी को व्यक्त करें । यह एक XML / HTML टेम्प्लेटिंग इंजन के रूप में JADE का उपयोग करता है , जो HTML को बहुत कम दर्दनाक बनाता है, लगभग सुरुचिपूर्ण भी।
- jQuery तकनीकी रूप से नोड मॉड्यूल नहीं है, लेकिन jQuery क्लाइंट-साइड उपयोगकर्ता इंटरफ़ेस के लिए जल्दी से एक वास्तविक मानक बन रहा है। jQuery, DOM तत्वों के सेट के लिए 'क्वेरी' करने के लिए CSS-जैसे चयनकर्ताओं को प्रदान करता है जिन्हें तब (सेट हैंडलर, प्रॉपर्टीज, स्टाइल आदि) पर संचालित किया जा सकता है। उसी नस के साथ, ट्विटर के बूटस्ट्रैप सीएसएस फ्रेमवर्क, एक MVC पैटर्न के लिए Backbone.js , और Browserify.js एक ही फाइल में अपने सभी जावास्क्रिप्ट फ़ाइलों को सिलाई करने के लिए। ये मॉड्यूल सभी वास्तविक मानक बन रहे हैं, इसलिए यदि आपने उनके बारे में नहीं सुना है, तो आपको कम से कम उनकी जाँच करनी चाहिए।
परिक्षण:
- JSHint - उपयोग करना चाहिए; मैंने पहले इसका इस्तेमाल नहीं किया था जो अब समझ से बाहर है। JSLint आपको जावा जैसी संकलित भाषा के साथ मिलने वाले मूल सत्यापन का एक गुच्छा वापस जोड़ता है। बेमेल कोष्ठक, अघोषित चर, कई प्रकार और आकार के प्रकार। आप विभिन्न तरीकों से भी चालू कर सकते हैं जिन्हें मैं "गुदा मोड" कहता हूं, जहां आप व्हाट्सएप और व्हाट्सएप की शैली को सत्यापित करते हैं, जो कि ठीक है यदि आपकी चाय का कप है - लेकिन वास्तविक मूल्य सटीक लाइन नंबर पर तत्काल प्रतिक्रिया प्राप्त करने से आता है जहां आप एक बंद ") को भूल गए" ... अपने कोड को चलाने के बिना और अपमानजनक रेखा को मारा। "JSHint" डगलस क्रॉकफोर्ड के JSLint का अधिक विन्यास योग्य रूप है ।
- मोचा प्रतियोगी जो कि मैं पसंद करने लगा हूँ। दोनों रूपरेखाएं मूल रूप से पर्याप्त रूप से संभालती हैं, लेकिन जटिल पैटर्न मोचा में व्यक्त करने में आसान होते हैं।
- स्वर प्रतिज्ञा वास्तव में काफी सुरुचिपूर्ण है। और यह आपको बताती है कि एक प्यारी सी रिपोर्ट (-स्पेक) आपको दिखाती है कि कौन से टेस्ट केस पास हुए / फेल हुए। इसे सीखने में 30 मिनट खर्च करें, और आप न्यूनतम प्रयास के साथ अपने मॉड्यूल के लिए बुनियादी परीक्षण बना सकते हैं।
- ज़ोंबी - एक आभासी "ब्राउज़र" के रूप में JSDom का उपयोग करके एचटीएमएल और जावास्क्रिप्ट के लिए प्रमुख परीक्षण । बहुत शक्तिशाली सामान। इन-ब्राउज़र कोड के लाइटनिंग निर्धारक परीक्षण प्राप्त करने के लिए इसे रीप्ले के साथ मिलाएं ।
- परीक्षण के बारे में "सोचने के लिए" पर एक टिप्पणी:
- परीक्षण गैर-वैकल्पिक है। जावास्क्रिप्ट की तरह एक गतिशील भाषा के साथ, बहुत कम स्थैतिक जाँच होती है। उदाहरण के लिए, दो मापदंडों को एक विधि से पारित करना जो 4 की अपेक्षा करता है जब तक कि कोड निष्पादित नहीं हो जाता है। जावास्क्रिप्ट में बग बनाने के लिए बहुत कम बार। संकलित भाषाओं के साथ सत्यापन अंतराल बनाने के लिए बुनियादी परीक्षण आवश्यक हैं।
- सत्यापन को भूल जाओ, बस अपना कोड निष्पादित करें। हर विधि के लिए, मेरा पहला सत्यापन मामला "कुछ भी नहीं टूटता" है, और यह वह मामला है जो सबसे अधिक बार आग लगाता है। यह साबित करते हुए कि आपका कोड 80% बग्स को फेंक दिए बिना चलता है और आपके कोड विश्वास को बेहतर बनाने के लिए इतना कुछ करेगा कि आप खुद को पीछे छोड़ते हुए और आपके द्वारा छोड़ी गई बारीक मान्यता के मामलों को जोड़ते हुए पाएंगे।
- छोटे से शुरू करें और जड़त्वीय अवरोध को तोड़ें। हम सभी आलसी हैं, और समय के लिए दबाया जाता है, और परीक्षण को "अतिरिक्त काम" के रूप में देखना आसान है। इसलिए छोटी शुरुआत करें। टेस्ट केस 0 लिखें - अपने मॉड्यूल को लोड करें और सफलता की रिपोर्ट करें। यदि आप अपने आप को सिर्फ इतना करने के लिए मजबूर करते हैं, तो परीक्षण के लिए जड़ता अवरोध टूट जाता है। प्रलेखन पढ़ने सहित यह पहली बार करने के लिए 30 मिनट है। अब टेस्ट केस 1 लिखें - अपने तरीकों में से एक को कॉल करें और "कुछ भी नहीं टूटता" को सत्यापित करें, अर्थात आपको एक त्रुटि वापस नहीं मिलती है। टेस्ट केस 1 को आपको एक मिनट से भी कम समय लेना चाहिए। जड़ता के चले जाने से, अपने परीक्षण कवरेज को बढ़ाना आसान हो जाता है।
- अब अपने कोड के साथ अपने परीक्षणों को विकसित करें। "सही" अंत-से-अंत परीक्षण जो मॉक सर्वर और उस सब के साथ की तरह दिखेंगे, से डरा नहीं। कोड सरल शुरू होता है और नए मामलों को संभालने के लिए विकसित होता है; परीक्षण भी चाहिए। जैसे ही आप अपने कोड में नए केस और नई जटिलता जोड़ते हैं, नए कोड को एक्सरसाइज करने के लिए टेस्ट केस जोड़ें। जैसा कि आपको बग मिलते हैं, त्रुटिपूर्ण कोड को कवर करने के लिए सत्यापन और / या नए मामले जोड़ें। जब आप डिबग कर रहे हों और कोड के एक टुकड़े में आत्मविश्वास खो दें, तो वापस जाएं और यह साबित करने के लिए परीक्षण जोड़ें कि यह वही कर रहा है जो आप सोचते हैं कि यह क्या है। उदाहरण डेटा के स्ट्रिंग्स को कैप्चर करें (आपके द्वारा कॉल की जाने वाली अन्य सेवाओं से, आप जो भी वेबसाइटों को खंगालते हैं, जो भी हों) और उन्हें अपने पार्सिंग कोड में फीड करें। यहां कुछ मामलों में, वहां सत्यापन में सुधार हुआ है, और आप अत्यधिक विश्वसनीय कोड के साथ समाप्त हो जाएंगे।
इसके अलावा, अनुशंसित Node.js मॉड्यूल की आधिकारिक सूची देखें । हालांकि, GitHub का नोड मॉड्यूल्स विकी अधिक पूर्ण और एक अच्छा संसाधन है।
नोड को समझने के लिए, कुछ महत्वपूर्ण डिजाइन विकल्पों पर विचार करना उपयोगी है:
Node.js ईवेंट आधारित और ASYNCHRONOUS / NON-BLOCKING है। एक आने वाले HTTP कनेक्शन की तरह घटनाएँ एक जावास्क्रिप्ट फ़ंक्शन को बंद कर देंगी जो थोड़ा सा काम करता है और अन्य अतुल्यकालिक कार्यों को बंद कर देता है जैसे डेटाबेस से कनेक्ट करना या किसी अन्य सर्वर से सामग्री खींचना। एक बार जब इन कार्यों को बंद कर दिया जाता है, तो ईवेंट फ़ंक्शन समाप्त हो जाता है और Node.js सोने के लिए वापस चला जाता है। जैसे ही कुछ और होता है, जैसे डेटाबेस कनेक्शन स्थापित हो रहा है या बाहरी सर्वर सामग्री के साथ प्रतिक्रिया दे रहा है, कॉलबैक कार्य करता है, और अधिक जावास्क्रिप्ट कोड निष्पादित होता है, संभवतः अधिक अतुल्यकालिक कार्यों (जैसे डेटाबेस क्वेरी) को किक करना। इस तरह, Node.js खुशी के साथ कई समानांतर वर्कफ़्लोज़ के लिए गतिविधियों को हल करेगा, जो भी गतिविधियाँ किसी भी समय अनब्लॉक हो रही हैं। यही कारण है कि Node.js एक साथ हजारों कनेक्शनों को प्रबंधित करने के लिए इतना अच्छा काम करता है।
हर किसी की तरह सिर्फ एक प्रक्रिया / थ्रेड प्रति कनेक्शन का उपयोग क्यों नहीं किया जाता?Node.js में, एक नया कनेक्शन केवल एक बहुत ही छोटा ढेर आवंटन है। एक नई प्रक्रिया को स्पिन करने से कुछ प्लेटफॉर्म पर मेगाबाइट में काफी अधिक मेमोरी लगती है। लेकिन असली लागत संदर्भ-स्विचिंग के साथ जुड़े ओवरहेड है। जब आपके पास 10 ^ 6 कर्नेल थ्रेड्स होते हैं, तो कर्नेल को यह पता लगाने में बहुत काम करना पड़ता है कि आगे कौन निष्पादित करना चाहिए। काम का एक गुच्छा लिनक्स के लिए O (1) शेड्यूलर के निर्माण में चला गया है, लेकिन अंत में, यह एक तरह से सीपीयू समय के लिए प्रतिस्पर्धा करने वाली 10 ^ 6 प्रक्रियाओं की तुलना में एकल-संचालित प्रक्रिया के लिए अधिक कुशल है। इसके अलावा, अधिभार की शर्तों के तहत, मल्टी-प्रोसेस मॉडल बहुत खराब व्यवहार करता है, महत्वपूर्ण प्रशासन और प्रबंधन सेवाओं को भुनाता है, विशेष रूप से एसएसएचडी (जिसका अर्थ है कि आप यह पता लगाने के लिए बॉक्स में लॉग इन नहीं कर सकते कि यह वास्तव में कितना खराब है)।
Node.js सिंगल थ्रेडेड और लॉक फ्री है । Node.js, एक बहुत ही जानबूझकर डिजाइन विकल्प के रूप में केवल एक धागा प्रति प्रक्रिया है। इस वजह से, कई थ्रेड्स के लिए एक साथ डेटा एक्सेस करना मूलभूत रूप से असंभव है। इस प्रकार, कोई ताले की जरूरत नहीं है। धागे कठिन हैं। वास्तव में वास्तव में कठिन है। यदि आप ऐसा नहीं मानते हैं, तो आपने पर्याप्त थ्रेडेड प्रोग्रामिंग नहीं की है। सही लॉक करना कठिन है और उन बग्स में परिणाम होता है जो वास्तव में नीचे ट्रैक करने के लिए कठिन हैं। तालों को खत्म करने और मल्टी-थ्रेडिंग के कारण नस्टिएस्ट क्लास के कीड़े दूर हो जाते हैं। यह नोड का सबसे बड़ा लाभ हो सकता है।
लेकिन मैं अपने 16 कोर बॉक्स का लाभ कैसे उठाऊं?
दो तरीके:
- छवि एन्कोडिंग जैसे बड़े भारी गणना कार्यों के लिए, Node.js बच्चे की प्रक्रियाओं को आग लगा सकते हैं या अतिरिक्त कार्यकर्ता प्रक्रियाओं को संदेश भेज सकते हैं। इस डिजाइन में, आपके पास एक थ्रेड होगा जो घटनाओं और एन प्रक्रियाओं के प्रवाह को प्रबंधित करता है और भारी गणना कार्य करता है और अन्य 15 सीपीयू को चबाता है।
- एक webservice पर थ्रूपुट को स्केल करने के लिए, आपको एक बॉक्स पर एक, एक कोर पर, कई Node.js सर्वर चलाने चाहिए, क्लस्टर का उपयोग करके (Node.js v0.6.x के साथ, आधिकारिक "क्लस्टर" मॉड्यूल यहां से सीखे गए वर्जनस्टॉप वर्जन को बदल देता है। एक अलग एपीआई)। ये स्थानीय Node.js सर्वर तब नए कनेक्शन को स्वीकार करने के लिए एक सॉकेट पर प्रतिस्पर्धा कर सकते हैं, उन पर भार को संतुलित कर सकते हैं। एक बार कनेक्शन स्वीकार कर लेने के बाद, यह इन साझा प्रक्रियाओं में से किसी एक के लिए कसकर बाध्य हो जाता है। सिद्धांत रूप में, यह बुरा लगता है, लेकिन व्यवहार में यह काफी अच्छी तरह से काम करता है और आपको थ्रेड-सुरक्षित कोड लिखने के सिरदर्द से बचने की अनुमति देता है। इसके अलावा, इसका मतलब है कि Node.js को उत्कृष्ट सीपीयू कैश आत्मीयता मिलती है, स्मृति बैंडविड्थ का उपयोग करके अधिक प्रभावी ढंग से।
Node.js आपको पसीने को तोड़ने के बिना कुछ वास्तव में शक्तिशाली चीजें करने देता है। मान लीजिए कि आपके पास एक Node.js प्रोग्राम है जो विभिन्न प्रकार के कार्य करता है,कमांड के लिएएक टीसीपी पोर्टपर सुनता है, कुछ छवियों को एनकोड करता है, जो भी। कोड की पांच पंक्तियों के साथ, आप एक HTTP आधारित वेब प्रबंधन पोर्टल में जोड़ सकते हैं जो सक्रिय कार्यों की वर्तमान स्थिति को दर्शाता है। ऐसा करना आसान है:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");
अब आप एक यूआरएल को हिट कर सकते हैं और अपनी चल रही प्रक्रिया की स्थिति की जांच कर सकते हैं। कुछ बटन जोड़ें, और आपके पास "प्रबंधन पोर्टल" है। यदि आपके पास एक रनिंग पर्ल / पायथन / रूबी स्क्रिप्ट है, तो बस "एक प्रबंधन पोर्टल में फेंकना" बिल्कुल सरल नहीं है।
लेकिन क्या जावास्क्रिप्ट धीमी / बुरी / बुरी / बुरी नहीं है? जावास्क्रिप्ट में कुछ अजीब विषमताएं हैं, लेकिन "अच्छे हिस्से" के साथ वहां एक बहुत शक्तिशाली भाषा है, और किसी भी मामले में, क्लाइंट (ब्राउज़र) पर जावास्क्रिप्ट भाषा है। जावास्क्रिप्ट यहाँ रहने के लिए है; अन्य भाषाएँ इसे IL के रूप में लक्षित कर रही हैं, और विश्व स्तर की प्रतिभा सबसे उन्नत जावास्क्रिप्ट इंजन का उत्पादन करने के लिए प्रतिस्पर्धा कर रही है। ब्राउज़र में जावास्क्रिप्ट की भूमिका के कारण, जावास्क्रिप्ट ब्लास्टिंग को तेज करने के लिए इंजीनियरिंग प्रयास का एक बड़ा हिस्सा फेंका जा रहा है। वी 8कम से कम इस महीने के लिए नवीनतम और सबसे बड़ा जावास्क्रिप्ट इंजन है। यह दक्षता और स्थिरता (आपको, रूबी) को देखते हुए अन्य स्क्रिप्टिंग भाषाओं को उड़ा देता है। और यह केवल Microsoft, Google और मोज़िला की समस्या पर काम करने वाली विशाल टीमों के साथ बेहतर होने जा रहा है, सबसे अच्छा जावास्क्रिप्ट इंजन बनाने के लिए प्रतिस्पर्धा कर रहा है (यह अब एक जावास्क्रिप्ट "दुभाषिया" नहीं है क्योंकि सभी आधुनिक इंजन JIT के टन हैंकेवल निष्पादन-एक बार कोड के लिए गिरावट के रूप में व्याख्या के साथ हुड के तहत संकलन। हाँ, हम सभी चाहते हैं कि हम odder जावास्क्रिप्ट भाषा विकल्पों में से कुछ को ठीक कर सकें, लेकिन यह वास्तव में उतना बुरा नहीं है। और भाषा इतनी कठोर लचीली है कि आप वास्तव में जावास्क्रिप्ट कोडिंग नहीं कर रहे हैं, आप स्टेप या jQuery कोडिंग कर रहे हैं - जावास्क्रिप्ट में किसी भी अन्य भाषा से अधिक, पुस्तकालयों ने अनुभव को परिभाषित किया है। वेब एप्लिकेशन बनाने के लिए, आपको बहुत कुछ भी जावास्क्रिप्ट को जानना होगा, इसलिए सर्वर पर इसके साथ कोडिंग करने से एक कौशल-कौशल तालमेल बनता है। इसने मुझे लेखन ग्राहक कोड नहीं बनाया है।
इसके अलावा, यदि आप जावास्क्रिप्ट से वास्तव में नफरत करते हैं, तो आप कॉफीस्क्रिप्ट जैसी सिंथेटिक चीनी का उपयोग कर सकते हैं । या कुछ और जो Google वेब टूलकिट (GWT) की तरह जावास्क्रिप्ट कोड बनाता है ।
जावास्क्रिप्ट की बात करते हुए, "बंद" क्या है? - बहुत सुंदर कहने का एक तरीका है कि आप कॉल चेन में लेक्सिकली स्कॉप्ड वैरिएबल को बनाए रखें। ;) ऐशे ही:
var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();
देखें कि आप किसी वस्तु को किसी वस्तु में बांधने की तरह कुछ भी किए बिना केवल "myData" का उपयोग कैसे कर सकते हैं? और जावा के विपरीत, "myData" चर को केवल पढ़ने के लिए नहीं होना चाहिए। यह शक्तिशाली भाषा सुविधा अतुल्यकालिक-प्रोग्रामिंग को बहुत कम क्रिया और कम दर्दनाक बनाती है।
एसिंक्रोनस कोड लिखना हमेशा सरल सिंगल-थ्रेडेड स्क्रिप्ट लिखने की तुलना में अधिक जटिल होता है, लेकिन Node.js के साथ, यह उतना कठिन नहीं है और आपको हजारों समवर्ती कनेक्शनों के लिए दक्षता और स्केलेबिलिटी के अलावा बहुत सारे लाभ मिलते हैं। ..