Node.js:如何创建启动应用程序的“平滑”重启?

时间:2011-07-03 10:28:39

标签: node.js

是否可以在没有停机的情况下创建node.js应用程序的平滑重启?

谢谢;)

3 个答案:

答案 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自动重启脚本。