2013-02-20 14 views
19

मेरी अज्ञानता को क्षमा करें, लेकिन एक Django/पायथन पृष्ठभूमि से आ रहा है, मैं पृष्ठभूमि में धीमी प्रक्रियाओं के माध्यम से काम कर रहे एक सेलेरी कतार रखने का बड़ा लाभ देख सकता हूं, जबकि वेब इंटरफ़ेस जितनी जल्दी हो सके अपडेट किया जाता है।नोड जेएस श्रमिक - उनके लिए कोई ज़रूरत है?

हालांकि, नोड अतुल्यकालिक रूप से काम कर रहा है, क्या कतार प्रणाली के लिए उपयोग केस बेहद कम हो गया है?

उदाहरण के लिए:

1 - साइट के लिए एक उपयोगकर्ता कुछ पोस्ट करता है, 2 - साइट से प्रतिक्रिया करता है, तो एक व्यवस्थापक मेल।

Django में, आप एक कार्य में व्यवस्थापक मेल भेज देंगे, बाद में निष्पादित किया जाएगा, और फिर अनुरोध का जवाब दें। सेलेरी पृष्ठभूमि में मेल भेजता है।

नोड में, आप अपने मेलर को कॉल करते हैं, फिर अनुरोध का जवाब देते हैं। मेलर फिर कॉल करने के लिए कॉलबैक भेजता है या नहीं, जिस बिंदु से उपयोगकर्ता पहले से ही प्रतिक्रिया देख रहा है।

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

या क्या मैं गलत समझ रहा हूं कि यह कैसे काम करता है !?

उत्तर

7

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

तो यदि आपके कार्यों में कुछ समय लगता है सीपीयू के अनुसार प्रक्रिया करने के लिए, यह बाहरी कतार का उपयोग करके और उन कार्यों/संदेशों को संभालने के लिए एक अलग प्रक्रिया का उपयोग करने के लिए अभी भी उपयोगी हो सकता है। यदि आपके कार्य io गहन हैं और थोड़ी देर लेते हैं क्योंकि वे उदाहरण के लिए अन्य सर्वर से प्रतिक्रियाओं की प्रतीक्षा कर रहे हैं, तो फिर से आवश्यकता नहीं है क्योंकि नोड io के साथ अच्छी तरह से सौदे करता है।

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

+1

तो अगर मैं कुछ ऐसा करना चाहता था जैसे किसी बाहरी एपीआई को उपयोगकर्ताओं को निकालने के लिए जानकारी - उदाहरण के लिए। Google के जियोकोडर को अनुरोध कॉल के साथ कुछ रिवर्स जियोकोडिंग करें। यह अनुरोध निम्नलिखित आने वाले अनुरोध के लिए मेरी नोड प्रक्रिया को रोक नहीं देगा? लेकिन अगर बहुत सी CPU उपयोग होता तो यह .. होगा? –

+1

आपको इसे बेंचमार्क करना होगा, लेकिन हां। यह मोटे तौर पर विचार है। आईओ ऑपरेशन की प्रतीक्षा करते समय कितना किया जा सकता है इसके बारे में कुछ विचार करने के लिए यहां देखें: http://www.eecs.berkeley.edu/~rcs/research/interactive_latency.html। नोड केवल एक समय में 1 चीज करता है, इसलिए यदि यह संख्या क्रंचिंग है, तो यह अनुरोधों को पूरा नहीं कर सकता है।जैसे ही आप कोई io करते हैं, आप मुक्त नोड को छोड़कर अन्य सामान करते हैं। – AndyD

+3

(सीमांत) स्पष्टता के लिए रीफ्रेशिंग: यदि आपके समांतर निष्पादन में HTTP या फ़ाइल सिस्टम अनुरोधों के लिए बहुत इंतजार करना शामिल है, तो नोड का अंतर्निहित एसिंक्रोनस I/O आपके लिए पर्याप्त समांतरता होगा। यदि आपके समांतर निष्पादन में स्थानीय रूप से बड़ी गणनाएं चलती हैं (वीडियो ट्रांसकोड करना; सिमुलेशन चलाना) तो नोड की एकल-थ्रेडेड प्रकृति आपको रोक देगी और यदि संभव हो तो आपको कार्यकर्ता को काम करना होगा। – Dave

4

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

+0

मैं समझता हूं। मैंने सोचा कि वहाँ बहुत सारे कतार कार्यान्वयन के कारण होने का एक कारण होना चाहिए, मैंने कहा था कि मैंने सोचा था कि उपयोग के मामले को पूरी तरह से चलाए जाने के बजाय कम किया गया था ... –

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