2012-11-12 23 views
9

मान लीजिए कि मैं 3-स्तरीय वेबसाइट बना रहा हूं, बैंग एंड पर मोंगो डीबी और कुछ वास्तव में हल्के जावास्क्रिप्ट ब्राउज़र में (आइए केवल फॉर्मों पर सत्यापन करें, शायद कुछ फैंसी नियंत्रण जो कुछ AJAX अनुरोधों को बंद कर देते हैं)।गहन प्रसंस्करण के लिए नोड.जेएस का उपयोग किया जाना चाहिए?

मुझे 'मध्यम' स्तर के लिए एक तकनीक चुनने की आवश्यकता है (हम इसे उप-स्तरों में विभाजित कर सकते हैं लेकिन यह विवरण यहां पर केंद्रित नहीं है, केवल समग्र तकनीक विकल्प), जहां मैं कुछ कच्चे डेटा को कम करना चाहता हूं डीबी से बाहर आ रहा है, और इसे कुछ HTML में प्रस्तुत करें जो मैं ब्राउज़र पर धक्का देता हूं। एक काफी आम पतली ग्राहक वेब वास्तुकला।

मेरी सुरक्षित पसंद जावा में इस मध्य स्तर को लागू करने के लिए, जोंगो जैसे कुछ पुस्तकालयों का उपयोग करके मोंगो डीबी से बात करने के लिए और शायद जैक्सन से मार्शल/अनमारशाल जेएसओएन से अपने फैंसी नियंत्रणों से बात करने के लिए जब वे AJAX अनुरोध करते हैं। और सर्वर पर मेरे एचटीएमएल को प्रस्तुत करने के लिए कुछ जावा टेम्पलेटिंग फ्रेमवर्क।

  • मैं जावास्क्रिप्ट (अच्छा भागों की तरह:

    हालांकि, मैं वास्तव में यह सब बाहर खिड़की फेंक और इस बीच श्रेणी के लिए Node.js का उपयोग कर निम्न कारणों से, के विचार से intrigued रहा हूँ), और चलिए इस एप्लिकेशन के व्यवसाय तर्क के लिए कहते हैं कि यह जावा से अधिक अभिव्यक्तिपूर्ण होगा।

  • यह हर जगह जावास्क्रिप्ट है। स्टैक पर कहीं भी काम करते समय, भाषाओं और वास्तव में ओओ और कार्यात्मक प्रतिमानों के बीच स्विच करने की आवश्यकता नहीं है। स्तरों के बीच कोई अनुवाद नलसाजी नहीं है, जेएसओएन हर जगह मूल रूप से समर्थित है।

  • मैं ग्राहक और सर्वर पर सत्यापन तर्क का पुन: उपयोग कर सकता हूं।

  • यदि भविष्य में मैं ब्राउज़र में एचटीएमएल प्रतिपादन क्लाइंट-साइड करने का निर्णय लेता हूं, तो मैं मौजूदा टेम्पलेट्स को बैकबोन जैसे कुछ कम रिफैक्टरिंग/रीस्टस्टिंग प्रयास के साथ पुन: उपयोग कर सकता हूं।

यदि आप इस बिंदु पर हैं और नोड की तरह हैं, तो उपरोक्त सभी स्पष्ट दिखाई देंगे। तो मुझे नोड सही चुनना चाहिए?

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

दो स्पष्ट समाधान दिमाग में आते हैं, लेकिन उनमें से कोई भी सही बैठता है:

  1. वहाँ में 'अवरुद्ध' व्यापार तर्क रखें और सिर्फ नोड उदाहरणों में से एक क्लस्टर और एक लोड संतुलन, सेवा अनुरोध करने के लिए उपयोग सच समानांतर में। ठीक है, तो नोड सिर्फ पहले स्थान पर बहु-थ्रेड क्यों नहीं है? या यह हमेशा विचार था, इसे सरल बेवकूफ रखने के लिए और आधार मामले में बहु थ्रेडेड जटिलता की संभावना से बचने के लिए, यदि प्रोग्रामर बहु-कोर प्रोसेसिंग पावर की वांछित है तो प्रोग्रामर अतिरिक्त सेटअप कार्य कर सकता है?

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

कौन मुझे मेरे सवाल की बात करने के अंत में ले जाता है - मैं नोड पहेली के कुछ बहुत बड़ा महत्वपूर्ण हिस्सा याद आ रही है, मैं बस अपना तथ्यों को पूरी तरह से गलत है, या नोड बस पर व्यापार तर्क क्रंचिंग के लिए अनुपयुक्त है सर्वर? एक और तरीका रखो, क्या नोड डेटाबेस पर बैठने के लिए उपयोगी है और कई सीआरयूडी अनुरोधों को अन्य निष्पादन और स्केलेबल तरीके से सेवा प्रदान करता है जो I/O पर अवरुद्ध करता है? और प्रदर्शन और स्केलेबिलिटी के किसी भी उचित स्तर को बनाए रखने के लिए, आपको नीचे दिए गए कुछ स्तरों या यहां तक ​​कि क्लाइंट-साइड में अपने सभी व्यावसायिक तर्क करना होगा?

नोड पर सभी चर्चा को ध्यान में रखते हुए, मुझे उम्मीद थी कि यह इस तालिका से अधिक लाएगा। मुझे अन्यथा आश्वस्त होना अच्छा लगेगा!

+0

कारण नोड एकल धागा है इसके सभी मौजूदा अवतारों में जावास्क्रिप्ट है (योजनाबद्ध या "किनारे" अवतार नहीं) एकल धागा है। इस नियम के कुछ अपवाद हैं, जैसे क्लाइंट में वेबवर्कर्स, लेकिन फिर भी आपका थ्रेडिंग मॉडल अन्य भाषाओं में आपके द्वारा उपयोग किए जाने वाले कार्यों से अलग है। – Matt

+0

अच्छा बिंदु, मैं वास्तव में वास्तव में बहु-थ्रेडेड का मतलब नहीं था, जैसे धागे डेटा साझा कर सकते हैं, मेरा मतलब वेबवर्कर्स के समान कुछ था - एक दूसरे के ज्ञान के बिना, समानांतर में अनुरोधों के लिए अनुरोधों का एक तरीका, बाहर डिब्बा। यह स्पष्ट रूप से क्लोडिंग नोड सर्वर द्वारा हासिल किया जा सकता है - मेरा सवाल यह है कि उपयोग का मामला क्या है जहां आप ऐसा नहीं करना चाहते हैं? एक नोड वेब सर्वर का वास्तविक व्यावहारिक उपयोग क्या है? – davnicwil

उत्तर

7

किसी भी प्रणाली पर आप एन उपलब्ध CPUs (1-64, या जो कुछ भी एन होता है) है। किसी भी सीपीयू-गहन अनुप्रयोग में, आप एन सीपीयू के थ्रूपुट से फंस जाएंगे। एन धागे/प्रक्रियाओं/जो कुछ भी जोड़कर इसे ठीक करने के लिए कोई जादुई तरीका नहीं है। या तो आपका कोड अधिक कुशल होना चाहिए, या आपको अधिक CPU की आवश्यकता है। अधिक धागे मदद नहीं करेंगे।

बहु-सीपीयू प्रदर्शन के बारे में थोड़ा-सराहना तथ्यों में से एक है कि अगर आप एक ही समय में एन 1 CPU- सघन आपरेशन चलाने की आवश्यकता, सीपीयू प्रति अपने प्रवाह क्षमता काफ़ी नीचे चला जाता है है। एक सीपीयू-गहन प्रक्रिया उस सीपीयू को इसे देने से पहले बहुत लंबे समय तक लटकती है, अन्य कार्यों को बहुत बुरी तरह भूख लगी है। अधिकांश मामलों में, यह I/O को अवरुद्ध कर रहा है और संगत कार्य-स्विचिंग जो आधुनिक ओएस मल्टीटास्किंग कार्य को साथ ही करता है। यदि हमारे हर दिन के सामान्य कार्यों में सीपीयू-बाउंड था, तो हम पाएंगे कि हमें वर्तमान में हमारे मशीनों में बहुत सी सीपीयू की आवश्यकता है।

अच्छी बात यह है कि Node.js सर्वर पार्टी दक्षता के अनुसार लाता है, प्रत्येक थ्रेड का पूर्ण उपयोग है। आदर्श रूप में, आप कम कार्य स्विचिंग के साथ समाप्त होता है। यह एक विशाल जीत नहीं है, लेकिन होने एन धागे एन * सी कनेक्शन से निपटने एसिंक्रोनस रूप से अधिक एन * सी धागे CPU की एक ही नंबर पर चल रहे अवरुद्ध प्रदर्शन लाभ के लिए जा रहा है। लेकिन सीपीयू पर निचली पंक्ति वही है: यदि आपके पास एन वास्तविक CPU काम करने के लायक हैं, तो आपको कुछ दर्द महसूस हो रहा है।

पिछली बार जब मैंने नोड.जेएस एपीआई को देखा तो सर्वर पर एक श्रोता और एक वर्कर थ्रेड के साथ एक सर्वर लॉन्च करने का एक तरीका था। आप ऐसा कर सकते हैं, मैं जाने के लिए इच्छुक हो जाएगा Node.js के साथ प्रदान की कुछ चेतावनियां मिले हैं:

  • जावास्क्रिप्ट-हर जगह दृष्टिकोण आप कुछ सादगी खरीदता है। कुछ जटिल के लिए, मैं एसिंक्रोनस प्रोग्रामिंग शैली के बारे में चिंतित हूं जो चीजों को आसान बनाने के बजाय कठिन बना देता है।
  • टेम्पलेट-प्रोसेसिंग और अन्य सीपीयू-गहन कार्य आपकी अन्य भाषा/प्लेटफार्म विकल्पों की तुलना में नोड.जेएस में सराहनीय रूप से धीमे नहीं हैं।
  • डेटाबेस ड्राइवर विश्वसनीय हैं।

    • एक धागा दुर्घटनाओं, तुम हार कनेक्शन के सभी कि धागा द्वारा सेवित किया जा रहा है:

    वहाँ एक नकारात्मक पक्ष यह है कि मैं देख सकता है।

अंत में, याद रखने की कोशिश करें कि प्रोग्रामर समय आमतौर पर सर्वर या बैंडविड्थ से अधिक महंगा होता है।

+0

ग्रेट उत्तर। तो मुझे लगता है कि यह I/O पर अवरुद्ध करने के द्वारा सुनने और सेवा अनुरोधों के लिए कम धागे (या यहां तक ​​कि संभवतः एक एकल धागा) का उपयोग करने के लिए वास्तव में नीचे आता है। यह बहुत समझ में आता है। कार्यकर्ता धागे के संभावित उपयोग को इंगित करने के लिए धन्यवाद - यह वही है जो मैं बात कर रहा था, यानी कुछ वास्तविक प्रसंस्करण की आवश्यकता होने पर कार्यकर्ता थ्रेड पूल में खेत करने में सक्षम होने के कारण, डीबी पढ़ने के कॉलबैक पर कहें, जबकि अनुरोध श्रोता धागा कताई रखते हुए। आप निश्चित रूप से सही हैं कि किसी भी काम को अंततः सर्वर के सीपीयू द्वारा बाध्य किया जाता है, और वी 8 की गति :-) – davnicwil

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