2013-06-30 11 views
9

मेरे पास एक नोडजेस सर्वर है जो http कॉल को सर्वर से बाहर करने के लिए व्यक्त करता है। क्या कुछ बुरा होने पर सर्वर को बंद करने के लिए एक अनुशंसित दृष्टिकोण है? क्या मुझे सर्वर को किसी भी तरह चलाना चाहिए?नोडज/एक्सप्रेस, शटडाउन

आईई। एक अपरिचित अपवाद पर सर्वर बस बंद हो जाता है, मुझे लगता है कि यह जुड़े ग्राहकों पर मार डालेगा और उन्हें प्रतिक्रिया वापस नहीं देगा।

मैं चाहिए: इससे पहले कि मैं सर्वर मर (और फिर उसे पुनरारंभ) करने की अनुमति पूरा करने के लिए सभी http कनेक्शन के लिए

  1. प्रतीक्षा।
  2. या क्या मुझे सर्वर को मरने से रोकने और रोकना चाहिए?

क्या यह उचित है?

process.on('exit', function() { 
    console.log('About to exit, waiting for remaining connections to complete'); 
    app.close(); 
}); 

इस मामले में एक त्रुटि एक अपरिभाषित राज्य में सर्वर छोड़ने फेंक दिया गया हो सकता है और सर्वर शेष कनेक्शन समाप्त करने के लिए जारी रहेगा।

क्या त्रुटियों को चलाने के लिए कोई अच्छा तरीका है या क्या मुझे सर्वर को मरने और पुनरारंभ करने देना चाहिए?

उत्तर

6

अनचाहे अपवादों के साथ कुछ भी फैंसी करने की कोशिश न करें। सर्वर मरने दें।

आम तौर पर, यदि एक मार्ग हैंडलर अपवाद फेंकता है, तो एक्सप्रेस बस इसे पकड़ लेगा और क्लाइंट को HTTP 500 वापस कर देगा। चूंकि एक्सप्रेस ने अपवाद पकड़ा, आपका सर्वर क्रैश नहीं होगा।

आमतौर पर ऐसा होता है कि सर्वर को लाता है जब कॉलबैक के अंदर एक अपवाद फेंक दिया जाता है; उदाहरण के लिए:

app.get('/foo', function(req, res) { 
    db.query(..., function(err, r) { 
     throw new Error(); // oops, we'll crash 
    }); 
}); 

क्योंकि कॉलबैक स्वाभाविक रूप से एक्सप्रेस रूटर कॉल स्टैक बाहर कार्यान्वित करता है, वहाँ यह एक विशेष अनुरोध के साथ संबद्ध करने के लिए कोई रास्ता नहीं है। हालांकि, अगर आप ऐसी स्थिति से बचाव कर सकते हैं:

app.get('/foo', function(req, res, next) { 
    db.query(..., function(err, r) { 
     try { 
      throw new Error(); 
     } catch(ex) { 
      next(ex); 
     } 
    }); 
}); 

एक्सप्रेस 'next समारोह इसके पहले तर्क के रूप में एक त्रुटि लेता है। यदि आपको कोई त्रुटि तर्क के साथ next फोन है, यह प्रसंस्करण मार्गों बंद हो जाएगा और एक error handler के लिए देखो, या सिर्फ एक 500

बेशक

लौटने के लिए, try/catch में सब कुछ लपेटकर शायद overkill है; ज्यादातर चीजें वास्तव में अपवाद फेंक नहीं देती हैं। आपको केवल यह करना चाहिए यदि आप जानते हैं कुछ फेंक सकता है। अन्यथा, आप अपवादों को निगल कर असंगत स्थिति को डीबग करना बहुत कठिन हो सकते हैं।

यह याद रखना महत्वपूर्ण है कि एक बार अप्रत्याशित अपवाद फेंक दिया जाता है, तो आपका आवेदन एक अनिर्धारित स्थिति में है। यह संभव है कि समस्या का अनुरोध कभी पूरा नहीं होगा, और आपका ऐप कभी भी पुनरारंभ नहीं होगा। या किसी अन्य अजीब चीजें हो सकती हैं। (क्या यह एक डेटाबेस मुद्दा था? फाइल सिस्टम? दूषित स्मृति?)

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

यदि आप उपलब्धता के बारे में चिंतित हैं, तो cluster module का उपयोग करें ताकि आपके पास कई (आमतौर पर CPU कोर की संख्या) सर्वर प्रक्रियाएं चल रही हों, और एक क्रैशिंग पूरी साइट को नीचे नहीं लाएगी।

+1

यह एक महान स्पष्टीकरण है। एक बात मैं अभी भी अस्पष्ट हूं हालांकि। 'यह याद रखना महत्वपूर्ण है कि एक बार अप्रत्याशित अपवाद फेंक दिया जाता है, तो आपका आवेदन एक अनिर्धारित स्थिति में है। यह संभव है कि समस्या का अनुरोध कभी पूरा नहीं होगा, और आपका ऐप कभी भी पुनरारंभ नहीं करेगा। यह ऐसा लगता है जैसे मुझे ऐप नहीं कहना चाहिए।बंद करे(); प्रक्रिया 'बाहर निकलें' पर। सच? – lostintranslation

+0

'प्रक्रिया' 'निकास' हैंडलर में 'app.close()' को कॉल करना व्यर्थ है: [दस्तावेज़ कहते हैं] (http://nodejs.org/api/process.html#process_event_exit) * "मुख्य ईवेंट लूप होगा 'बाहर निकलें' कॉलबैक खत्म होने के बाद अब नहीं चलाया जा सकता है। "* दूसरे शब्दों में, 'निकास' घटना आपको प्रक्रिया को बता रही है ** ** आपके फ़ंक्शन रिटर्न के बाद ** समाप्त हो जाएगी। नेटवर्क श्रोता बंद करना व्यर्थ है क्योंकि कोई अगला टिक नहीं है; आने वाले कनेक्शन को स्वीकार करने के लिए कोड को चलाने का अवसर कभी नहीं होगा। – josh3736

+0

भयानक, धन्यवाद! – lostintranslation

5

नोडजेएस बंद हो जाएगा जब यह कुछ भी होने की उम्मीद नहीं है; जबकि http सर्वर कनेक्शन पर इंतजार कर रहा है नोड चल रहा है।

server.close([callback])

नए कनेक्शन स्वीकार करने से सर्वर बंद कर देता है और मौजूदा कनेक्शन रहता है। यह फ़ंक्शन एसिंक्रोनस है, सर्वर अंततः बंद हो जाता है जब सभी कनेक्शन समाप्त हो जाते हैं और सर्वर close ईवेंट उत्सर्जित करता है। वैकल्पिक रूप से, आप close ईवेंट सुनने के लिए कॉलबैक पास कर सकते हैं।

ऐसा करने के बाद सर्वर अंतिम कनेक्शन समाप्त होने तक चलना जारी रखेगा और फिर चुपचाप बंद कर देगा।

यदि आप कनेक्शन को समाप्त करने के लिए इंतजार नहीं करना चाहते हैं तो आप अपने शेष कनेक्शन पर socket.end() या socket.destroy() का उपयोग कर सकते हैं।

http://nodejs.org/api/net.html


process.on('exit', function() { 
    console.log('About to exit, waiting for remaining connections to complete'); 
    app.close(); 
}); 

जब नोड मौजूद है और वास्तव में बाहर निकलने के लिए नोड नहीं बता इस समारोह चलाना चाहिए देखें।

process.exit([code])

निर्दिष्ट कोड के साथ प्रक्रिया समाप्त होता है: यहाँ एक तरह से आप अपने प्रक्रिया समाप्त कर सकते हैं, लेकिन यह शान से खत्म नहीं होता है। यदि छोड़ा गया है, तो बाहर निकलें 'सफलता' कोड 0 का उपयोग करता है।

एक 'विफलता' कोड के साथ बाहर निकलने के लिए:

process.exit(1); खोल उस नोड निष्पादित 1 के रूप में बाहर निकलने के कोड देखना चाहिए।

देखें http://nodejs.org/api/process.html


मुझे आशा है कि इस मदद करता है!

0

यदि आप एक्सप्रेस का उपयोग कर रहे हैं तो आप शट डाउन को सुसंगत तरीके से संभालने के लिए इस एनपीएम मॉड्यूल का उपयोग कर सकते हैं।

https://www.npmjs.com/package/express-graceful-shutdown

+0

कृपया एक नोड संबद्धता दिखाएं :) एनपीएम के अनुसार आप लिंक किए गए प्लगइन के रखरखाव कर रहे हैं। – geisterfurz007

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