2013-02-11 24 views
6

मैंने अभी तक तैनात नहीं किया है, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।उचित रूप से रोकना, प्रतीक्षा करना और रीडिंग करना node.js heroku प्रक्रिया

मेरे पास एक ऐप है जो कई पृष्ठभूमि प्रक्रियाओं का उपयोग करता है। यही है, प्रतिक्रिया के बाद भी, पृष्ठभूमि में निष्पादित प्रतिक्रिया के साथ जुड़े फ़ंक्शंस अभी भी हैं। इस प्रकार, मैं ऐसा कुछ करना चाहता हूं:

var server = http.createServer(app).listen(80) 

process.on('SIGINT', function() { 
    server.close() 
    setTimeout(function() { 
    process.exit() 
    }, 30000) // Wait 30 seconds before exiting 
}) 

मुझे यकीन नहीं है कि यह सही है या नहीं। अधिक धारणाएं:

  • ये पृष्ठभूमि प्रक्रियाएं महत्वपूर्ण हैं। हालांकि, वे शायद 1-2 सेकंड ले लेंगे, 30 सेकंड नहीं। फिर भी, मैं केवल सुरक्षा के लिए 30 सेकंड देरी रखना चाहता हूं।
  • यह (हमेशा के लिए साथ, कहते हैं) दोनों प्रक्रिया को पुन: प्रारंभ करने के लिए काम करना चाहिए और इस प्रक्रिया को रोकने
  • क्या संकेत Heroku (या किसी अन्य प्रक्रिया) process के माध्यम से Node.js को भेजती है? क्या मुझे उन्हें किसी भी तरह से संभालना होगा?
  • क्या मैं uncaughtException को किसी भी अलग तरीके से संभालूं?

धन्यवाद

उत्तर

10

समझ गया। बंद होने पर Heroku SIGTERM सिग्नल भेजता है। अगर प्रक्रिया 10 सेकंड में बाहर नहीं निकलती है, तो यह SIGKILL सिग्नल भेजता है। इस प्रकार, निम्नलिखित के लिए पर्याप्त है:

process.on('SIGTERM', server.close.bind(server)) 

https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with-sigterm

10 सेकंड मान लिया जाये कि पर्याप्त पृष्ठभूमि प्रक्रियाओं को पूरा करने के लिए है।

असल में, "बाहर निकलने" संकेत से पहले "बंद" सिग्नल x सेकंड भेजें और आपको अच्छा होना चाहिए।

2

मुझे लगता है कि आप बेहतर उन पृष्ठभूमि नौकरियों (Heroku पर कार्यकर्ता dyno) करने के लिए एक कार्यकर्ता प्रक्रिया का उपयोग करें।

यह दोनों आपके वेब सर्वर को जितनी जल्दी हो सके अपने उपयोगकर्ताओं को सेवा प्रदान करने के लिए स्वतंत्र करते हैं और स्केलिंग के दौरान आपको बेहतर नियंत्रण प्राप्त करने की अनुमति देते हैं (उदाहरण के लिए, 3 वेब डायनोस और 2 कार्यकर्ता डायनोस चलाना)।

आप कार्यकर्ता dyno को नौकरियां जमा करने के लिए रेडिस की पब/उप कार्यक्षमता का उपयोग कर सकते हैं (या ऐसा करने के लिए लाइब्रेरी का उपयोग करें, जैसे http://learnboost.github.com/kue/)।

इस तरह, जब कोई वेब डिनो पुन: प्रारंभ/मर जाता है/आदि .. इसका पृष्ठभूमि लंबित पृष्ठभूमि पर कोई प्रभाव नहीं पड़ता है और जब कोई कर्मचारी डिनो पुनरारंभ होता है तो यह केवल लंबित नौकरियों का उपभोग करेगा और उन्हें संसाधित करेगा, इसलिए आप ' पुनरारंभ करने के कारण किसी भी नौकरियों को खोना नहीं है।

+0

1. ये नौकरियां डीबी कार्य हैं इसलिए मुझे श्रमिकों का उपयोग करने में कोई बिंदु नहीं दिख रहा है। जब तक मैं नौकरी कतार में हूं, यह पहले से ही किया जा सकता है। 2. मैं एक और डेटाबेस जोड़ने के लिए नहीं जा रहा हूँ। 3. मुझे कई ढेर नहीं चाहिए। –

+2

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

+0

उत्तर बहुत आसान है - 'सिगिनट' या 'सिगिल' के बजाय 'सिगरम' घटना को सुनें: https://devcenter.heroku.com/लेख/dynos # सुंदर-बंद-साथ-sigterm –

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

  • कोई संबंधित समस्या नहीं^_^