nodejs在一个端口上运行两个应用程序

时间:2013-10-01 03:01:42

标签: javascript node.js process failover

为了减少长时间的重新启动造成的停机时间减少痛苦,我想到了这样的事情:

  1. 80端口的主要应用#1。
  2. 端口80上的故障转移应用程序#2,但仅在应用程序#1不工作的情况下应答请求。
  3. 让App#2为活跃用户提供“维护”消息。
  4. 在同一个端口上运行两个进程最终会出现在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来从另一个进程终止它 - 最好是跨操作系统?或者该场景的其他想法?

2 个答案:

答案 0 :(得分:4)

您可以在另一个端口上为您的App#1提供服务,并编写一个将代理请求的微应用程序,如果对App#1的请求失败,则返回其他内容。您可以使用here之类的node-http-proxy,或推送自己的解决方案,例如this,只需添加“on error”子句。

答案 1 :(得分:1)

我喜欢阿马丹的回答。最重要的是,我不得不提及除了登录.on('error')(以及unchaughtException)之外的其他操作不建议。系统可能处于易失性状态(例如,模块的内部状态可能不一致),并且您不希望像这样长时间运行。

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