Jawaban lain benar-benar gila karena Anda dapat membaca di dokumen Node sendiri di http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception
Jika seseorang menggunakan jawaban lain, baca Node Docs:
Perhatikan bahwa uncaughtException
ini adalah mekanisme yang sangat kasar untuk penanganan pengecualian dan dapat dihapus di masa depan
PM2
Pertama-tama, saya sangat merekomendasikan PM2
untuk menginstal Node.js
. PM2 sangat hebat dalam menangani crash dan memonitor aplikasi Node serta load balancing. PM2 segera memulai aplikasi Node setiap kali crash, berhenti karena alasan apa pun atau bahkan ketika server restart. Jadi, jika suatu hari bahkan setelah mengelola kode kami, aplikasi macet, PM2 dapat segera memulai kembali. Untuk info lebih lanjut, Menginstal dan Menjalankan PM2
Sekarang kembali ke solusi kami untuk mencegah aplikasi itu sendiri crash.
Jadi setelah melewati akhirnya saya menemukan apa yang disarankan oleh Node document:
Jangan gunakan uncaughtException
, gunakan domains
dengan cluster
sebagai gantinya. Jika Anda menggunakannya uncaughtException
, mulai ulang aplikasi Anda setelah setiap pengecualian yang tidak tertangani!
DOMAIN dengan Cluster
Apa yang sebenarnya kita lakukan adalah mengirim respons kesalahan ke permintaan yang memicu kesalahan, sambil membiarkan yang lain selesai dalam waktu normal mereka, dan berhenti mendengarkan permintaan baru pada pekerja itu.
Dengan cara ini, penggunaan domain berjalan seiring dengan modul gugus, karena proses master dapat memotong seorang pekerja baru ketika seorang pekerja menemukan kesalahan. Lihat kode di bawah ini untuk memahami apa yang saya maksud
Dengan menggunakan Domain
, dan ketahanan memisahkan program kami menjadi beberapa proses pekerja menggunakan Cluster
, kami dapat bereaksi lebih tepat, dan menangani kesalahan dengan keamanan yang jauh lebih besar.
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);
}
Meskipun Domain
sedang menunggu penghentian dan akan dihapus sebagai pengganti baru datang seperti yang dinyatakan dalam Dokumentasi Node
Modul ini sedang menunggu penghentian. Setelah API pengganti diselesaikan, modul ini akan sepenuhnya tidak digunakan lagi. Pengguna yang benar-benar harus memiliki fungsionalitas yang disediakan domain dapat mengandalkannya untuk saat ini tetapi harus berharap harus bermigrasi ke solusi yang berbeda di masa mendatang.
Tetapi sampai penggantian baru tidak diperkenalkan, Domain dengan Cluster adalah satu-satunya solusi yang bagus seperti yang disarankan oleh Node Documentation.
Untuk memahami Domain
dan Cluster
membaca secara mendalam
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
Terima kasih kepada @Stanley Luo karena telah membagikan kepada kami penjelasan mendalam yang luar biasa tentang Cluster dan Domains ini
Cluster & Domains
restart your application after every unhandled exception!
Dalam kasus 2000 pengguna menggunakan server web node untuk streaming video dan 1 pengguna mendapat pengecualian maka memulai ulang tidak akan mengganggu semua pengguna lain?uncaughtException
dan digunakanDomain
denganCluster
demikian, jika satu pengguna menghadapi pengecualian maka hanya utasnya yang dihapus dari cluster dan dibuat yang baru untuknya. Dan Anda tidak perlu me-restart server Node Anda juga. Sementara di sisi lain jika Anda menggunakanuncaughtException
Anda harus me-restart server Anda setiap kali ada pengguna Anda menghadapi masalah. Jadi, gunakan Domain dengan Cluster.domain
sudah sepenuhnya ditinggalkan dan dihapus?cluster
danworkers
: sitepoint.com/...Saya menempatkan kode ini tepat di bawah pernyataan dan deklarasi global yang saya perlukan:
bekerja untukku. satu-satunya hal yang saya tidak suka tentang itu adalah saya tidak mendapatkan info sebanyak yang saya akan jika saya membiarkan hal itu crash.
sumber
forever
atau sesuatu.Seperti disebutkan di sini, Anda akan menemukan
error.stack
menyediakan pesan kesalahan yang lebih lengkap seperti nomor baris yang menyebabkan kesalahan:sumber
Mencoba
supervisor
Atau Anda dapat menginstal
forever
.Semua ini akan dilakukan adalah memulihkan server Anda ketika crash dengan me-restart itu.
forever
dapat digunakan dalam kode untuk memulihkan proses apa pun yang macet secara anggun.The
forever
docs memiliki informasi yang solid pada penanganan pemrograman keluar / error.sumber
Menggunakan try-catch dapat memecahkan kesalahan yang tidak tertangkap, tetapi dalam beberapa situasi yang kompleks, itu tidak akan melakukan pekerjaan dengan benar seperti menangkap fungsi async. Ingatlah bahwa di Node, panggilan fungsi async apa pun dapat berisi kemungkinan operasi mogok aplikasi.
Menggunakan
uncaughtException
adalah solusi tetapi itu diakui sebagai tidak efisien dan kemungkinan akan dihapus di versi Node masa depan, jadi jangan mengandalkan itu.Solusi ideal adalah menggunakan domain: http://nodejs.org/api/domain.html
Untuk memastikan aplikasi Anda aktif dan berjalan meskipun server Anda macet, gunakan langkah-langkah berikut:
gunakan node cluster untuk melakukan beberapa proses per core. Jadi jika satu proses mati, proses lain akan otomatis boot up. Periksa: http://nodejs.org/api/cluster.html
gunakan domain untuk menangkap operasi async alih-alih menggunakan try-catch atau tidak tertangkap. Saya tidak mengatakan bahwa mencoba-tangkap atau tidak tertangkap adalah pikiran buruk!
gunakan selamanya / supervisor untuk memantau layanan Anda
tambahkan daemon untuk menjalankan aplikasi simpul Anda: http://upstart.ubuntu.com
semoga ini membantu!
sumber
Cobalah untuk mencoba modul simpul PM2 itu jauh konsisten dan memiliki dokumentasi yang bagus. Manajer proses produksi untuk aplikasi Node.js dengan penyeimbang beban bawaan. harap hindari uncaughtException untuk masalah ini. https://github.com/Unitech/pm2
sumber
UncaughtException adalah "mekanisme yang sangat kasar" (sangat benar) dan domain sudah tidak digunakan lagi. Namun, kami masih memerlukan beberapa mekanisme untuk menangkap kesalahan di sekitar domain (logis). Perpustakaan:
https://github.com/vacuumlabs/yacol
dapat membantu Anda melakukan ini. Dengan sedikit tulisan tambahan, Anda dapat memiliki semantik domain yang bagus di sekitar kode Anda!
sumber
Bekerja dengan baik pada restify:
sumber