Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
升级Node.JS web app而不重新启动_Node.js_High Availability - Fatal编程技术网

升级Node.JS web app而不重新启动

升级Node.JS web app而不重新启动,node.js,high-availability,Node.js,High Availability,是否有一种方法可以在不重新启动Node.JS应用程序的情况下更改其代码 例如,如果当时正在从服务器下载一个文件,是否有办法升级服务器而不中断文件传输?是的,可以使用该模块 基本上,您将通过主进程启动应用程序的多个从实例,这些从实例共享同一端口。主设备将把传入连接分配给从设备 当您要重新启动时,主机将按顺序: worker 5156 died - starting slave with PID 5164 worker 5157 died - starting slave with PID 5165

是否有一种方法可以在不重新启动Node.JS应用程序的情况下更改其代码


例如,如果当时正在从服务器下载一个文件,是否有办法升级服务器而不中断文件传输?

是的,可以使用该模块

基本上,您将通过主进程启动应用程序的多个从实例,这些从实例共享同一端口。主设备将把传入连接分配给从设备

当您要重新启动时,主机将按顺序:

worker 5156 died
- starting slave with PID 5164
worker 5157 died
- starting slave with PID 5165
worker 5158 died
- starting slave with PID 5166
worker 5159 died
- starting slave with PID 5167
  • 停止向从属服务器传递连接
  • 轻轻地告诉它重新启动
  • 等待它重生
这里有一些代码可以帮助您开始(您需要
npm安装异步下划线

注意:这只是为了让您开始。您应该准备好在实际设置中处理意外的从属设备故障和超时

var cluster = require('cluster');
var http = require('http');
var _ = require('underscore');
var async = require('async');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log('starting master with PID', process.pid);
  // Fork workers.
  var slaves = {};

  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('fork', function (worker) {
    slaves[worker.id] = worker;
  });

  cluster.on('exit', function (worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
    delete slaves[worker.id];

    // restart the worker
    cluster.fork();
  });

  process.on('SIGHUP', function restartApp() {
    console.log('restarting all slaves');
    // important: force node.js to reload all js sources
    delete require.cache;

    var toRestart = _(slaves).values();

    async.eachSeries(toRestart, function (slave, done) {
      slave.kill('SIGTERM');

      // when the new worker starts, proceed to the next instance
      cluster.once('listening', function () {
        done();
      });
    });
  });
} else {
  console.log('- starting slave with PID', process.pid);
  // Workers can share any TCP connection
  // In this case its a HTTP server
  var server = http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world\n");
  });

  process.on('SIGTERM', function () {
    // finish all current connections, then stop
    server.close(function () {
      process.exit(0);
    });
  });

  server.listen(8000);
}
重新启动时,始终有3个正在运行的从属设备来处理传入连接

最后一件事:如果您尝试,
console.log
不会在从属SIGTERM处理程序中执行任何操作,因为它已与主处理器断开连接