क्या पृष्ठभूमि प्रसंस्करण के लिए नोड एक अच्छा फिट है?


10

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

मेरे और नोड के लिए एक बड़ी "जीत" तथ्य यह है कि यह क्लाइंट और सर्वर दोनों के लिए जावास्क्रिप्ट का उपयोग करता है। मैं अपने दिन की नौकरी में जावा और जावास्क्रिप्ट में कोड करता हूं लेकिन रूबी में भी बहुत अच्छा हूं।

लेकिन, जैसा मैंने कहा, यह हर जगह एक भाषा का उपयोग करने के लिए आकर्षक लगता है और जेएस उस बिल को फिट करता है।

हालाँकि, मुझे बैकग्राउंड जॉब चलाने के लिए JS का उपयोग करने का ज्यादा अनुभव नहीं था। रूबी को इस पर गर्व है। और मैं इसका इस्तेमाल करने का विरोध नहीं कर रहा हूं। तो इसके लिए 100% JS पर आपके क्या विचार हैं? मुझे लगता है कि बहुत बड़ी परियोजनाओं को कस्टम समाधान की आवश्यकता होती है। मैं सोच रहा था कि क्या यह प्रयास के लायक है। या, मैं बस रूबी के साथ उन तरह के कामों पर टिकूं?

राय की सराहना की।

धन्यवाद


आप नोड के विकल्प के रूप में vert.x को भी देखना चाह सकते हैं ।
माइक

जवाबों:


13

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

जेएस एकल-थ्रेडेड और अवरुद्ध है, जिसका अर्थ है कि फ़ंक्शन कॉल पूरा होने तक और कुछ भी निष्पादित नहीं कर सकता है। यह जेएस की एक वांछित विशेषता थी, अनिवार्य रूप से आपके हाथों से सभी थ्रेडिंग और कतारबद्ध चिंताओं को लेना। जेएस सी / सी ++ सामान को हुड के तहत अधिक बहु-थ्रेडेड फैशन में चलने से नहीं रोकता है, इसलिए जेएस की भूमिका वास्तव में अधिक वास्तुकला / दूत है। यदि आप छवि-प्रसंस्करण कर रहे हैं, तो आप इसे तुल्यकालिक जावास्क्रिप्ट कमांड के साथ संभालना नहीं चाहते हैं क्योंकि आपके ऐप या सर्वर पर बाकी सब कुछ तब तक अवरुद्ध रहेगा जब तक आप इसे पूरा नहीं कर लेते। विचार यह है कि आप किसी छवि को बाध्य C / C ++ कार्यक्षमता से संसाधित करने के लिए कहते हैं, और फिर छवि के संसाधित होने पर 'किए गए' ईवेंट का जवाब दें।

इसके लिए यह आवश्यक है कि किसी भी Node.js एप्लिकेशन में JS भारी घटना और कॉलबैक से प्रेरित हो या यह बहुत खराब प्रदर्शन करेगा। इसलिए आपको नोड में बहुत सारी विधि कॉल नहीं दिखेंगी जो बाद में उपयोग के लिए फ़ंक्शन नहीं सौंपती हैं। एक बात जो नोड में बहुत तेजी से स्पष्ट हो जाती है वह यह है कि आप बदसूरत दुनिया के लिए हैं यदि आपको कॉलबैक पिरामिड को संभालने का कोई तरीका नहीं मिलता है। जैसे

//event CBs are more DOM-style than Node style and this isn't built-in Node file I/O
//keeping it simple and quick since I'll just get Node stuff wrong from memory
file.get('someFile.txt', function(e){
    e.fileObj.find('some snippet', function(e){
        someFinalCallBackHandler( e.snippetLocations );
    } );
} );

सौभाग्य से इस बेहतर से निपटने के लिए बहुत सारे उपकरण और उदाहरण हैं। ज्यादातर वादे तंत्र के इर्द-गिर्द घूमते हैं और बस एक फंक्शन में एक दूसरे के कॉलबैक स्टेट्स का जवाब देने के लिए फंक्शंस की एक श्रृंखला का पीछा करते हैं, जो हुड के नीचे आपके लिए बदसूरत पिरामिड सामान करता है।

व्यक्तिगत रूप से, मैं प्यार को ध्यान में रखते हुए कहता हूं कि हमें जेएस उच्च स्तर पर मिलता है और क्रोम के करीब सी / सी ++। यह परम कॉम्बो है और इसने मुझे सी सीखना शुरू करने के लिए प्रेरित किया है और जब तक आप कुछ शोध नहीं करते हैं तब तक पुस्तकालय की क्षमता को कम नहीं होने देता है। नोड पुस्तकालयों का उत्पादन बहुत तेज गति से हो रहा है और बहुत तेजी से परिपक्व हो रहा है। यदि आप कुछ भी नहीं कर रहे हैं तो बहुत ही असामान्य हालात अच्छे हैं, किसी ने इसे कवर किया है।

रेल से सबसे बड़ा अंतर यह है कि जेएस के रेल पर होने की संभावना नहीं है क्योंकि यह थे। हम इसे करने में सक्षम होने के लिए कोड करते हैं, हालांकि आप इसे बहुत तेज़ी से चाहते हैं, इसलिए कारक के साथ खुद को लटका देने के लिए रस्सी है और जेएस में हाल के वर्षों तक आर्किटेक्चर सुंदर DIY रहा है। मैं उस स्वतंत्रता को कहता हूं, लेकिन मुझे लगता है कि आदर्श को बहुत सारे देवों के रूप में नहीं देखा जाता है।

इसके अलावा, Node.js में आपको कभी भी "मणि" की समस्या नहीं होगी क्योंकि आपने मैक के अलावा किसी अन्य चीज़ पर स्थापित करने का प्रयास किया था। क्लाइंट-साइड वेब देवता निर्भरता के मुद्दों को समाप्त कर देते हैं और यहीं से बहुत सारे नोड्स कोर आ रहे हैं। यदि यह प्रत्येक लोकप्रिय मंच पर 5 मिनट या उससे कम समय में बॉक्स से बाहर काम नहीं करता है, तो हम आम तौर पर इसे उखाड़ फेंकते हैं और टॉस करते हैं। मुझे अभी तक एक लोकप्रिय मॉड्यूल में भाग लेना है जो मुझे काम करने के लिए कुछ विशेष करने की आवश्यकता है। पैकेज प्रणाली, उत्कृष्ट है।

लेकिन अपने मूल प्रश्न का अधिक स्पष्ट रूप से / संक्षिप्त रूप से उत्तर देने के लिए: क्या यह पृष्ठभूमि प्रक्रियाओं के साथ अच्छा है?

हां, नोड मूल रूप से घटनाओं और कॉलबैक के माध्यम से ऐप चलाने के माध्यम से पृष्ठभूमि की प्रक्रिया है।


1
यहाँ बहुत सारी सामान्य जानकारी है, लेकिन आपने एसिंक्रोनस रूप से अनुरोधों को संभालने के लिए नोड.जेएस की क्षमता के बारे में कुछ नहीं कहा है।
रॉबर्ट हार्वे

अच्छी बात। मैं वहां कुछ और फोकस रखूंगा।
एरिक रेपेन

एक पूर्व रेल डेवलपर और एक अर्ध-अनुभवी Node.js डेवलपर के रूप में, मैं निश्चित रूप से रूबी / रेल दुनिया और JS / Node.js दुनिया एरिक के बीच पैकेज प्रणाली की तुलना से असहमत हूं। किसी भी अनुभवी (या यहां तक ​​कि अनुभवी नहीं) रेल डेवलपर को पता है कि "रत्न", शाब्दिक रूप से रत्न की तरह हैं। वे सहजता से काम करते हैं। उनमें से ज्यादातर अच्छी तरह से परीक्षण, मजबूत और स्थिर हैं। हालांकि, एनपीएम के आधे से अधिक मॉड्यूल खराब तरीके से डिज़ाइन किए गए हैं, परीक्षण नहीं किए गए हैं और यहां तक ​​कि पूरा नहीं किया गया है। उदाहरण के लिए, कोई भी मुझे जेसी की जगह डेविस या पेपरक्लिप को समान गुणवत्ता और सुविधा संपन्नता के साथ नहीं दिखा सकता है। बिल्कुल नहीं।
डरावनी

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

यह उत्तर इतने सारे उत्थान का हकदार है
अमीन मोहम्मद अजानी

2

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


1

IO में Node.js एक्सेल। आपको एक दिन की खोज करने की बहुत संभावना नहीं है कि आपकी प्रक्रिया जाम हो गई है क्योंकि आपके अधिकांश धागे SQL कॉल में अवरुद्ध हो रहे हैं।

हालाँकि, नोड-js वास्तव में गणना-बाउंड कार्य पर खराब है । जब मैं "बहुत सारे IO" सुनता हूं तो मुझे लगता है कि "हाँ! जाओ नोड!", लेकिन जब मैंने सुना "पार्सिंग," मैं थोड़ा संकोच करता हूं। मुझे यकीन नहीं है कि यह किसी भी कारण से है, इसके अलावा लोग नोड को ठीक से नहीं बढ़ा रहे हैं, लेकिन इस प्रकार मेरे उत्पाद के सभी कंपाउंड-बाउंड काम नोड के बाहर होते हैं।

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

यह भी ध्यान दें कि कुछ उद्यम क्षमताओं में नोड थोड़ा कमजोर हो सकता है। उदाहरण के लिए, इसकी लॉगिंग लाइब्रेरी जावा की तुलना नहीं करती है। वर्तमान में, कोई अच्छा लॉगिंग ढांचा नहीं है जो यहां तक ​​कि समर्थन और एमडीसी भी है, जिसका अर्थ है कि आपको बहुत var logPrefix = userId + ": "कुछ करना है।

मैंने कभी भी एक निजी एनपीएम रेपो नहीं चलाया है, आपको इनमें से किसी एक की आवश्यकता हो सकती है जो आपके कोड के स्वामित्व पर निर्भर करता है।


1

यदि आपकी पृष्ठभूमि प्रक्रियाएं क्रमिक रूप से चल सकती हैं तो यह बहुत अच्छा हो सकता है। अपनी अंतिम स्थिति में, मुझे कई डेटा स्रोतों के लिए कई पूर्व-प्रोसेसर, निर्यात और अनुवाद उपयोगिताओं को लिखना पड़ा। NodeJS का उपयोग करना यहाँ एक हवा थी।

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

सलाह, उन मॉड्यूल से चिपके रहें जो धाराओं का उपयोग करते हैं। इससे उस विशेष चरण के लिए आपके प्रसंस्करण को मॉड्यूल में पाइप करना आसान हो सकता है। यदि आप उदाहरण के लिए gulp-build के लिए gulp-jade में इवेंट-स्ट्रीम का उपयोग करते हैं, तो आप यह देख सकते हैं कि यह कितना सक्षम है।

CSV के लिए, आप नोड-सीएसवी का उपयोग कर सकते हैं , जो कि प्रोसेसर स्ट्रीम में पाइपिंग रिकॉर्ड के लिए आधार स्थापित करने में बहुत अच्छा है।

बड़े-ईश एक्सएमएल के लिए, जहां आप एक बार में एक ही रिकॉर्ड करना चाहते हैं, मैं नोड-हॉफस्टिक्सलएम को देखूंगा जो एसएएक्स प्रोसेसर का उपयोग करके आपके एक्सएमएल स्ट्रीम के माध्यम से पढ़ता है, और प्रत्येक नोड के लिए घटनाओं को उठाता है। मैं इसे एक रीड / राइट-स्ट्रीम में लपेटूंगा ताकि आप अपने वांछित मैचों को बढ़ा सकें। नोड में कई xml- ऑब्जेक्ट पार्सर एक बार में पूरे xml को पढ़ने / पार्स करने का प्रयास करेंगे, और 100ml xml जो बहुत बड़ा हो जाता है ... के लिए कहने का प्रयास करेंगे ... जहां पर आधी धारा xml धारा के रूप में पढ़ेगी।

ध्यान दें: xml-stream जैसे अन्य प्रोसेसर हैं जो कि एक्सपैट (सी लाइब्रेरी) का उपयोग करेंगे, जो कि अधिक प्रदर्शन दे सकते हैं, लेकिन बिल्ड वातावरण के बिना कम पोर्टेबल।

सामान्य तौर पर, यह उपयोग करने के लिए एक वास्तविक आनंद रहा है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.