为了减少长时间的重新启动造成的停机时间减少痛苦,我想到了这样的事情:
在同一个端口上运行两个进程最终会出现在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来从另一个进程终止它 - 最好是跨操作系统?或者该场景的其他想法?
答案 0 :(得分:4)
您可以在另一个端口上为您的App#1提供服务,并编写一个将代理请求的微应用程序,如果对App#1的请求失败,则返回其他内容。您可以使用here之类的node-http-proxy,或推送自己的解决方案,例如this,只需添加“on error”子句。
答案 1 :(得分:1)
我喜欢阿马丹的回答。最重要的是,我不得不提及除了登录.on('error')
(以及unchaughtException
)之外的其他操作不建议。系统可能处于易失性状态(例如,模块的内部状态可能不一致),并且您不希望像这样长时间运行。
要么做Amadan所说的,要么使用node.js域,或者在负载均衡器后面使用几个进程(这基本上是Amadan所说的)。