0

为了减少长期应用程序重启造成的停机时间,我想到了类似的方法:

  1. 端口 80 上的主应用程序 #1。
  2. 端口 80 上的故障转移应用程序 #2,但仅在应用程序 #1 不工作时才响应请求。
  3. 让 App #2 为活跃用户提供“维护”消息。

在同一个端口上运行两个进程以Error: EADDRINUSE- 所以简单的方法不起作用。我偶然发现了该server.on('error')事件,并决定让 App #2 等到 App #1 可能停止,以便端口可用:

function tryPitchIn(){
     var server = http.createServer(app);

     server.on('listening', function(){
        console.log('Application #1 crashed/ended');
        console.log('Pitching in...');
     });

     server.on('error', function(){
        console.log('noting to do');
        setTimeout(tryPitchIn, 250);
     });

     server.listen(80);
}

tryPitchIn();

虽然上面的工作很好,但我不得不在 App #1 的初始化中结束 App #2,这在不同的操作系统上并不容易。

是否可以为节点进程(由 启动npm start)提供静态 ID 以从另一个进程终止它 - 最好是跨操作系统?或者该场景的其他想法?

4

2 回答 2

4

您可以在另一个端口上为您的 App #1 提供服务,并编写一个微应用来代理对它的请求,并在对 App #1 的请求失败时返回其他内容。您可以像这里一样使用 node-http-proxy ,或者像这样推出自己的解决方案,只需添加一个“on error”子句。

于 2013-10-01T03:12:13.757 回答
1

我喜欢阿马丹的回答。最重要的是,我不得不提一下,除了登录.on('error')(以及登录unchaughtException)之外,不建议做很多事情。该系统可以是处于不稳定状态(例如,模块的内部状态可能不一致),您不希望像那样长时间运行。

要么按照 Amadan 所说的去做,要么使用 node.js 域,或者使用负载均衡器后面的多个进程(这基本上是 Amadan 所说的)。

于 2013-10-01T03:41:03.053 回答