寻求nodejs的故障恢复方法
发布于 8 年前 作者 alexbian 6009 次浏览 最后一次编辑是 5 年前

抽空看了下《node.js开发指南》 里面提到: –“当程序有错误发生时,整个进程就会结束,需要重 新在终端中启动服务器。这一点在开发中无可厚非,但在产品环境下就是严重的问题 了,因为一旦用户访问时触发了程序中某个隐含的bug,整个服务器就崩溃了,将无 法继续为所有用户提供服务。在部署Node.js 应用的时候一定要考虑到故障恢复,提 高系统的可靠性。”

想想看确实是啊,而有google上搜了一下也没有相关介绍。

还请大虾们有空来讨论一下啊。

15 回复

有相关的模块和插件能控制。另外如果你部署在云服务上的话,这样的问题他们会去做。

楼主自相矛盾啊

“一旦用户访问时触发了程序中某个隐含的bug,整个服务器就崩溃”

“在部署Node.js 应用的时候一定要考虑到故障恢复”

如果用户不断触发这个BUG呢,故障是不是也要无限循环恢复(重启进程)? JS的致命错误会导致进程终止这是事实,解决方法无非2个

1.做好容错方面的测试,让程序没有BUG;对于功能固定的应用,这是容易办到的

2.多使用try catch语句

不过应用不是自己开发的,单纯的重启进程非常危险;一般情况下该死进程的时候还是让它死掉比较好

这该说什么好呢,还是感谢这位兄弟的热心回答。

说到底,这是个质量控制的问题,用什么web server都一样,能预测的致命的bug就不应该存在! 推广一下,假设操作系统也有这样的bug,你又能怎样呢?比如windows的蓝屏~,windows能自己处理蓝屏的话,蓝屏就不会存在了。

程序是人写的,不能指望程序自己“永远不死”,真有这一天的话…尼奥必须出来拯救世界了~~

process.on('uncaughtException', function (err) {
  // 当有异常未处理时(原本应该是自动退出进程的),监听uncaughtException事件可以
  // 避免进程退出,在此处记录err出错信息,以便以后找到你的程序中隐含的Bug
});

参考这里:http://nodejs.org/api/process.html#process_event_uncaughtexception

不过,在写程序时就应该考虑到,你的程序有可能被随时重启的,不要太依赖这个。

靠谱,还是对nodejs自身的东西了解的不够啊,感谢!

Linux 可以使用upstart 自动维护进程

进程未死,V8已挂,植物人有何意义

建议使用cluster,然后fork多个worker,使用心跳包,当master失去和worker的心跳,则重启worker,这样就可以避免僵尸进程的存在

嗯,正准备尝试cluster

@seasonx4 何为“进程未死,V8已挂”?

同时你可以再worker发送心跳包的时候发送内存使用情况,让master做内存检测,如果超过内存使用标准,就记录日志,然后重启worker。

必要的系统监控是需要的。

回到顶部