是否可以在没有停机的情况下创建node.js应用程序的平滑重启?
谢谢;)
答案 0 :(得分:2)
我采用了类似于PartlyCloudy的方法,但只是在同一进程上使用多个节点线程,并使用操作系统作为负载均衡器而不是单独的。
所以我的代码在我的“app.coffee”代码中被盗:
我只添加了一个“setTimeout”。在5到20秒的时间内,我的8个核心可能有16个叉子而不是8个,但这对我来说比停机时间更好。
var childProcesses, cluster, i, numCPUs, signals, _i;
cluster = require('cluster');
numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
childProcesses = [];
for (i in numCPUs) {
childProcesses[i] = cluster.fork();
}
signals = ["SIGINT", "SIGTERM", "SIGQUIT"];
for (i in signals) {
process.on(signals[i], function() {
// THIS IS WHAT KEEPS IT UP
setTimeout(function() {
var j;
for (j in childProcesses) {
childProcesses[j].kill();
}
process.exit();
}, 20000);
});
}
cluster.on('exit', function(worker, code, signal) {
childProcesses.push(cluster.fork());
});
} else {
app.listen(3000);
}
答案 1 :(得分:1)
根据您的使用案例,应用程序样式和状态,您还可以启动运行相同应用程序的多个节点进程,并在前面放置反向代理/负载均衡器(即HAProxy)。如果进程崩溃,只要该节点尚未重新启动,负载均衡器就会将新请求分派给其他进程。这也通过利用多个核来提高性能。但是,会话等共享状态可能更难处理(即外部使用Redis)。
答案 2 :(得分:0)
如果您的脚本崩溃,您将每次都有停机时间,这是不可能阻止的。但是,只要崩溃,您就可以使用forever.js自动重启脚本。