Các câu trả lời khác thực sự điên rồ khi bạn có thể đọc tại các tài liệu của chính Node tại http://nodejs.org/docs/latest/api/ process.html # process_event_uncaughtexception
Nếu ai đó đang sử dụng các câu trả lời đã nêu khác, hãy đọc Node Docs:
Lưu ý rằng đó uncaughtException
là một cơ chế rất thô sơ để xử lý ngoại lệ và có thể bị xóa trong tương lai
PM2
Trước hết, tôi rất khuyên bạn nên cài đặt PM2
cho Node.js
. PM2 thực sự tuyệt vời trong việc xử lý sự cố và giám sát các ứng dụng Node cũng như cân bằng tải. PM2 ngay lập tức khởi động ứng dụng Node bất cứ khi nào nó gặp sự cố, dừng vì bất kỳ lý do nào hoặc ngay cả khi máy chủ khởi động lại. Vì vậy, nếu một ngày nào đó ngay cả sau khi quản lý mã của chúng tôi, ứng dụng gặp sự cố, PM2 có thể khởi động lại nó ngay lập tức. Để biết thêm thông tin, Cài đặt và Chạy PM2
Bây giờ trở lại giải pháp của chúng tôi để ngăn chặn ứng dụng bị sập.
Vì vậy, sau khi trải qua, cuối cùng tôi đã nghĩ ra những gì mà tài liệu Node gợi ý:
Không sử dụng uncaughtException
, sử dụng domains
với cluster
thay thế. Nếu bạn sử dụng uncaughtException
, hãy khởi động lại ứng dụng của bạn sau mỗi ngoại lệ chưa được xử lý!
TÊN MIỀN với cụm
Những gì chúng tôi thực sự làm là gửi phản hồi lỗi cho yêu cầu gây ra lỗi, đồng thời để những người khác hoàn thành trong thời gian bình thường của họ và ngừng lắng nghe các yêu cầu mới trong nhân viên đó.
Theo cách này, việc sử dụng tên miền đi đôi với mô-đun cụm, vì quy trình chính có thể rẽ nhánh một công nhân mới khi một công nhân gặp lỗi. Xem mã dưới đây để hiểu ý tôi là gì
Bằng cách sử dụng Domain
và khả năng phục hồi của việc tách chương trình của chúng tôi thành nhiều quy trình công nhân sử dụng Cluster
, chúng tôi có thể phản ứng phù hợp hơn và xử lý các lỗi với độ an toàn cao hơn nhiều.
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);
}
Mặc dù Domain
đang chờ khấu hao và sẽ bị xóa vì sự thay thế mới được nêu trong Tài liệu của Node
Mô-đun này đang chờ khấu hao. Khi một API thay thế đã được hoàn thành, mô-đun này sẽ không được chấp nhận hoàn toàn. Người dùng hoàn toàn phải có chức năng mà tên miền cung cấp có thể dựa vào nó trong thời gian này nhưng sẽ phải chuyển sang một giải pháp khác trong tương lai.
Nhưng cho đến khi thay thế mới không được giới thiệu, Domain with Cluster là giải pháp tốt duy nhất mà Tài liệu Node gợi ý.
Để hiểu sâu Domain
và Cluster
đọc
https://nodejs.org/api/domain.html#domain_domain (Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
Cảm ơn @Stanley Luo đã chia sẻ cho chúng tôi lời giải thích sâu sắc tuyệt vời này về Cụm và Tên miền
Cụm & tên miền