अन्य उत्तर वास्तव में पागल हैं जैसा कि आप नोड के स्वयं के दस्तावेजों में http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception पर पढ़ सकते हैं
यदि कोई अन्य बताए गए उत्तरों का उपयोग कर रहा है, तो नोड डॉक्स पढ़ें:
ध्यान दें कि uncaughtException
अपवाद से निपटने के लिए एक बहुत ही कच्चा तंत्र है और भविष्य में इसे हटाया जा सकता है
PM2
सबसे पहले, मैं अत्यधिक के PM2
लिए स्थापित करने की सलाह दूंगा Node.js
। PM2 क्रैश से निपटने और नोड एप्लिकेशन के साथ-साथ लोड संतुलन की निगरानी करने में वास्तव में बहुत अच्छा है। PM2 तुरंत जब भी क्रैश होता है तो नोड ऐप शुरू करता है, किसी भी कारण से रुकता है या सर्वर के पुनरारंभ होने पर भी। इसलिए, अगर किसी दिन हमारे कोड को प्रबंधित करने के बाद भी, ऐप क्रैश हो जाता है, तो PM2 इसे तुरंत पुनः आरंभ कर सकता है। अधिक जानकारी के लिए, इंस्टॉल करना और PM2 चलाना
अब एप्लिकेशन को दुर्घटनाग्रस्त होने से बचाने के लिए हमारे समाधान पर वापस आ रहा है।
इसलिए अंत में जाने के बाद मैं अंत में स्वयं के साथ क्या दस्तावेज लेकर आया था:
का प्रयोग न करें uncaughtException
, उपयोग domains
के साथ cluster
बजाय। यदि आप उपयोग करते हैं uncaughtException
, तो हर खंडित अपवाद के बाद अपने आवेदन को फिर से शुरू करें!
क्लस्टर के साथ DOMAIN
हम वास्तव में क्या करते हैं, उस त्रुटि के लिए एक प्रतिक्रिया भेजते हैं जो त्रुटि को ट्रिगर करता है, जबकि दूसरों को उनके सामान्य समय में खत्म करने देता है, और उस कार्यकर्ता में नए अनुरोधों को सुनना बंद कर देता है।
इस तरह, डोमेन उपयोग क्लस्टर मॉड्यूल के साथ हाथ से हाथ जाता है, क्योंकि मास्टर प्रक्रिया एक कार्यकर्ता को एक त्रुटि होने पर एक नए कार्यकर्ता को कांटा कर सकती है। मेरे कहने का मतलब समझने के लिए नीचे दिया गया कोड देखें
का उपयोग करके Domain
, और हमारे कार्यक्रम को कई कार्यकर्ता प्रक्रियाओं में उपयोग करने की लचीलापन Cluster
, हम अधिक उचित प्रतिक्रिया कर सकते हैं, और बहुत अधिक सुरक्षा के साथ त्रुटियों को संभाल सकते हैं।
var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;
if(cluster.isMaster)
{
cluster.fork();
cluster.fork();
cluster.on('disconnect', function(worker)
{
console.error('disconnect!');
cluster.fork();
});
}
else
{
var domain = require('domain');
var server = require('http').createServer(function(req, res)
{
var d = domain.create();
d.on('error', function(er)
{
//something unexpected occurred
console.error('error', er.stack);
try
{
//make sure we close down within 30 seconds
var killtimer = setTimeout(function()
{
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
//stop taking new requests.
server.close();
//Let the master know we're dead. This will trigger a
//'disconnect' in the cluster master, and then it will fork
//a new worker.
cluster.worker.disconnect();
//send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
}
catch (er2)
{
//oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
//Because req and res were created before this domain existed,
//we need to explicitly add them.
d.add(req);
d.add(res);
//Now run the handler function in the domain.
d.run(function()
{
//You'd put your fancy application logic here.
handleRequest(req, res);
});
});
server.listen(PORT);
}
हालाँकि Domain
, लंबित वंचित है और हटा दिया जाएगा क्योंकि नए प्रतिस्थापन के रूप में नोड के प्रलेखन में कहा गया है
यह मॉड्यूल अपग्रेडेशन लंबित है। एक बार एक प्रतिस्थापन एपीआई को अंतिम रूप देने के बाद, यह मॉड्यूल पूरी तरह से समाप्त हो जाएगा। उपयोगकर्ता जो पूरी तरह से कार्यक्षमता है कि डोमेन प्रदान करते हैं उस समय के लिए उस पर भरोसा कर सकते हैं, लेकिन भविष्य में एक अलग समाधान के लिए पलायन करने की उम्मीद करनी चाहिए।
लेकिन जब तक नया प्रतिस्थापन नहीं लाया जाता है, तब तक क्लस्टर के साथ डोमेन एकमात्र अच्छा समाधान है जो नोड डॉक्यूमेंटेशन बताता है।
गहराई से समझने Domain
और Cluster
पढ़ने के लिए
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
क्लस्टर और डोमेन पर इस अद्भुत इन-डेप्थ स्पष्टीकरण को साझा करने के लिए @ स्टेनली लुओ का धन्यवाद
क्लस्टर और डोमेन