উত্তর:
আপনি নোডের নিজস্ব ডকুমেন্টগুলিতে http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception এ পড়তে পারবেন বলে অন্যান্য উত্তরগুলি সত্যই উন্মাদ
যদি কেউ অন্য বর্ণিত উত্তর ব্যবহার করে থাকে তবে নোড ডক্সটি পড়ুন:
নোটটি
uncaughtException
ব্যতিক্রম পরিচালনার জন্য খুব অশোধিত প্রক্রিয়া এবং ভবিষ্যতে মুছে ফেলা হতে পারে
PM2
প্রথম সব, আমি অত্যন্ত ইনস্টল সুপারিশ করবে PM2
জন্য Node.js
। পিএম 2 ক্রম পরিচালনা এবং নোড অ্যাপ্লিকেশনগুলির পাশাপাশি লোড ব্যালেন্সিং পরিচালনা করার ক্ষেত্রে দুর্দান্ত। পিএম 2 নোড অ্যাপটি তত্ক্ষণাত শুরু করে যখনই এটি ক্রাশ হয়ে যায়, কোনও কারণে বন্ধ হয়ে যায় বা সার্ভার পুনরায় চালু হওয়ার পরেও। সুতরাং, যদি কোনও দিন আমাদের কোড পরিচালনা করার পরেও, অ্যাপ ক্র্যাশ হয়ে যায়, পিএম 2 সাথে সাথে এটি পুনরায় চালু করতে পারে। আরও তথ্যের জন্য, ইনস্টল এবং পিএম 2 চালানো
অ্যাপটি নিজেই ক্রাশ হওয়া থেকে রোধ করার জন্য এখন আমাদের সমাধানে ফিরে আসছি।
সুতরাং পরে যাওয়ার পরে অবশেষে নোড ডকুমেন্ট নিজেই যা বলেছিল তা নিয়ে এসেছি:
ব্যবহার করবেন না
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
অবনতি মুলতুবি রয়েছে এবং নোডের ডকুমেন্টেশনে উল্লিখিত হিসাবে নতুন প্রতিস্থাপন আসার সাথে সাথে তা সরানো হবে
এই মডিউলটি অবনতি মুলতুবি রয়েছে। প্রতিস্থাপনের API একবার চূড়ান্ত হয়ে গেলে, এই মডিউলটি পুরোপুরি হ্রাস করা হবে। ডোমেনগুলি সরবরাহ করে এমন কার্যকারিতা অবশ্যই ব্যবহারকারীর জন্য আপাতত নির্ভর করতে পারে তবে ভবিষ্যতে অন্য কোনও সমাধানে মাইগ্রেট করতে হবে বলে আশা করা উচিত।
তবে নতুন প্রতিস্থাপন চালু না করা পর্যন্ত ক্লাস্টারের সাথে ডোমেন হ'ল নোড ডকুমেন্টেশনের পরামর্শ দেয় এমন একমাত্র ভাল সমাধান।
গভীরতা বোঝার জন্য Domain
এবং Cluster
পড়ার জন্য
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
ক্লাস্টার এবং ডোমেনগুলি সম্পর্কে আমাদের এই বিস্ময়কর গভীরতার ব্যাখ্যা ভাগ করে নেওয়ার জন্য @ স্ট্যানলি লুওকে ধন্যবাদ
restart your application after every unhandled exception!
যদি 2000 ব্যবহারকারী ভিডিও স্ট্রিমিংয়ের জন্য নোড ওয়েব সার্ভার ব্যবহার করে এবং 1 জন ব্যতিক্রম পেয়েছে তবে পুনরায় চালু করা সমস্ত অন্যান্য ব্যবহারকারীকে বাধা দেবে না?
uncaughtException
এবং ব্যবহারের Domain
সঙ্গে Cluster
পরিবর্তে তাই হয়, একজন ব্যবহারকারী একটি ব্যতিক্রম তাই কেবল থ্রেড ক্লাস্টার থেকে সরানো এবং তার জন্য নতুন এক তৈরি করা হয় মুখোমুখি পারেন। এবং আপনার নোড সার্ভারটিও আবার চালু করার দরকার নেই। অন্যদিকে আপনি যদি ব্যবহার করেন তবে আপনাকে uncaughtException
প্রতিবার আপনার ব্যবহারকারীর যে কোনও সমস্যার মুখোমুখি হওয়াতে আপনার সার্ভারটি পুনরায় চালু করতে হবে। সুতরাং, ক্লাস্টার সহ ডোমেন ব্যবহার করুন।
domain
পুরোপুরি হ্রাস এবং অপসারণ করা হলে আমাদের কী করা উচিত ?
আমি এই কোডটি আমার প্রয়োজনীয় বিবৃতি এবং বিশ্বব্যাপী ঘোষণার আওতায় রেখেছি:
process.on('uncaughtException', function (err) {
console.error(err);
console.log("Node NOT Exiting...");
});
আমার জন্য কাজ কর. আমি কেবল এটি সম্পর্কে পছন্দ করি না তা হ'ল আমি কেবল জিনিসটি ক্র্যাশ করতে দিলে আমি যতটা তথ্য পাই না।
forever
বা কিছু ব্যবহারের চেয়ে ভাল না ।
এখানে উল্লিখিত হিসাবে আপনি error.stack
একটি আরও সম্পূর্ণ ত্রুটি বার্তা সরবরাহ করতে পারেন যেমন লাইন নম্বর যা ত্রুটির কারণ হয়েছিল:
process.on('uncaughtException', function (error) {
console.log(error.stack);
});
চেষ্টা supervisor
npm install supervisor
supervisor app.js
অথবা আপনি forever
পরিবর্তে ইনস্টল করতে পারেন ।
আপনার সার্ভারটি পুনরায় চালু করে ক্র্যাশ করলে এটি পুনরুদ্ধার করে।
forever
কোডের মধ্যে ক্র্যাশ হয়ে যাওয়া যে কোনও প্রক্রিয়া রহমত করে পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে।
forever
ডক্স প্রস্থান / ত্রুটি প্রোগ্রামেটিক্যালি পরিচালনা কঠিন তথ্য নেই।
ট্র্যাচ-ক্যাচ ব্যবহার করা অনাবৃত ত্রুটিগুলি সমাধান করতে পারে তবে কিছু জটিল পরিস্থিতিতে এটি ঠিক কাজটি করবে না যেমন অ্যাসিঙ্ক ফাংশন ধরা। মনে রাখবেন যে নোডে, কোনও অ্যাসিঙ্ক ফাংশন কলগুলিতে একটি সম্ভাব্য অ্যাপ ক্রাশিং অপারেশন থাকতে পারে।
ব্যবহার uncaughtException
করা একান্ত কার্যকরী তবে এটি অদক্ষ হিসাবে স্বীকৃত এবং নোডের ভবিষ্যতের সংস্করণগুলিতে মুছে ফেলার সম্ভাবনা রয়েছে, সুতরাং এটিতে বিশ্বাস করবেন না।
আদর্শ সমাধানটি ডোমেন ব্যবহার করা: http://nodejs.org/api/domain.html ml
আপনার অ্যাপ্লিকেশনটি চালু রয়েছে এবং আপনার সার্ভার ক্রাশ হয়েছে এমনটি নিশ্চিত করার জন্য, নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করুন:
কোর প্রতি একাধিক প্রক্রিয়া কাঁটাচামচ নোড ক্লাস্টার ব্যবহার করুন। সুতরাং যদি একটি প্রক্রিয়া মারা যায়, অন্য প্রক্রিয়াটি অটো বুট হবে। দেখুন: http://nodejs.org/api/cluster.html .h
অ্যাসিঙ্ক অপারেশন ধরার জন্য ডোমেন ব্যবহার করে দেখুন চেষ্টা বা ক্যাচ না করে ব্যবহার করুন। আমি বলছি না যে ট্রাই-ক্যাচ বা অবহেলা খারাপ ধারণা!
আপনার পরিষেবাগুলি নিরীক্ষণ করতে চিরতরে / সুপারভাইজার ব্যবহার করুন
আপনার নোড অ্যাপটি চালাতে ডেমন যুক্ত করুন: http://upstart.ubuntu.com
আশাকরি এটা সাহায্য করবে!
Pm2 নোড মডিউলটি চেষ্টা করে দেখুন এটি অনেকটা সুসংগত এবং দুর্দান্ত ডকুমেন্টেশন রয়েছে। বিল্ট-ইন লোড ব্যালেন্সার সহ নোড.জেএস অ্যাপসের জন্য উত্পাদন প্রক্রিয়া পরিচালক। এই সমস্যার জন্য অনুগ্রহপূর্বক এড়ানো দয়া করে। https://github.com/Unitech/pm2
আনকউটএক্সেপশন হ'ল "একটি খুব ক্রুড মেকানিজম" (তাই সত্য) এবং ডোমেনগুলি এখন হ্রাস করা হয়েছে। তবে, ডোমেনগুলির চারপাশে ত্রুটিগুলি ধরার জন্য আমাদের এখনও কিছু ব্যবস্থা দরকার। লাইব্রেরি:
https://github.com/vacuumlabs/yacol
আপনি এটি করতে সাহায্য করতে পারেন। অতিরিক্ত কিছু লেখার সাথে আপনার কোডের চারপাশে দুর্দান্ত ডোমেন শব্দার্থক শব্দ থাকতে পারে!
স্বাচ্ছন্দ্যে দুর্দান্ত কাজ করে:
server.on('uncaughtException', function (req, res, route, err) {
log.info('******* Begin Error *******\n%s\n*******\n%s\n******* End Error *******', route, err.stack);
if (!res.headersSent) {
return res.send(500, {ok: false});
}
res.write('\n');
res.end();
});