如何提高NodeJS程序的稳定性
发布于 4年前 作者 longbill 6828 次浏览 最后一次编辑是 3年前

当我们写了个NodeJS程序的时候,一般用node yourjsfile.js命令启动该程序。但是如果程序中有东西出错,这个进程就会退出。我们写程序不可能保证万无一失,肯定有些没有处理的错误,这就让很多人觉得NodeJS不稳定,容易产生很多故障。 下面我就讲讲几种方法增加你的NodeJS程序的稳定性。

1.使用 try{…} catch(error){…} 来执行容易出错的代码段。比如解析一个外来的json字符串等。
2.使用 process.on('uncaughtException’, function(err){…}); 来处理未被捕捉的错误。
3.试用奶妈进程来启动你的程序,检测子进程的退出,然后自动重启该进程。比如 mother.js :


start();

function start()
{
console.log(‘Mother process is running.’);
var ls = require(‘child_process’).spawn('node’, [‘server.js’]);
ls.stdout.on('data’, function (data)
{
console.log(data.toString());
});
ls.stderr.on('data’, function (data)
{
console.log(data.toString());
});
ls.on('exit’, function (code)
{
console.log('child process exited with code ' + code);
delete(ls);
setTimeout(start,5000);
});
}


4.使用 nohup 让nodejs进程在后台运行。 比如运行"nohup node yourjsfile.js > /dev/null &"

 

欢迎大家补充。

9 回复

最近正被nodejs稳定性困扰,前两个办法似乎都不能解决我的问题。
由于nodejs中很多处理都是异步的,try…catch对于callback中的error无能为力。
第2个办法我已经用了,但程序依然会毫无征兆地退出,uncaughtException的callback没有执行。
启动参数加了–trace_exception也不管用,不知道还有没有其它方法?

uncaughtException是个不得已的方法,不建议太依赖它,该容错的地方还得老老实实try … catch。

callback里异常的捕获确实麻烦,因为try … catch 只能抓到同一个ticket中的异常,而callback属于不同的ticket。这种情况只能在callback函数内部try…catch

谢谢回答。
uncaughtException主要是用来debug,以便有机会找到异常原因并修复。
其实我想问nodejs(或v8)有哪些debug/profiling方法,我的一个程序每运行N天左右异常退出,且没有stack trace,普通的单步调试方法基本上找不到错误原因。想解决这样的问题。

后来发现有一个v8启动参数: node --stack_trace_on_abort
但得到的错误信息非常少,需要进行更多的profiling才能找到错误根源。

完全可以使用cluster或者forever之类的工具来启动并保持server进程哪

通过mutil-node多启动几个也可以增加稳定性

可以试试monit,比forever,supervisor之类的更强大一些,而且是在进程外部监控的,更简单可依赖

回到顶部