node后端服务保活的实现
引言
目前的项目中使用了node,作为一个简单的后端服务,随着承担着越来越多的线上业务的服务,就要求了服务端的稳定性,而其中最重要的一点就是服务保活。有进程终止后自动重启的能力。
forever
forever是一个简单的命令行工具,他能确保一个给定的脚本持续运行。forever完全基于命令行操作,在forever进程之下,创建node的子进程,通过monitor监控node子进程的运行情况,一旦文件更新,或者进程挂掉,forever会自动重启node服务器,确保应用正常运行。
所以就看一下forever的项目吧。主要的进程控制方面的代码地址。
start方法
letchild_process=require('child_process') letspawn=child_process.spawn Monitor.prototype.start=function(restart){ varself=this, child; child=this.trySpawn(); ... returnthis; }; Monitor.prototype.trySpawn=function(){ varrun=this.parser(this.command,this.args.slice()), stats; returnspawn(run.command,run.args,this.spawnWith); };
核心就是使用了nodeapi中的spawn,创建子进程,这个子进程就是我们真正的需要运行的node端服务。
自动restart
父子进程的通信核心就是为了保活,主要就是监听了子进程,也就是需要被守护进程的exit事件
child.on('exit',function(code,signal){ varspinning=Date.now()-self.ctime=self.max&&!self.forceRestart) ||(spinning&&typeofself.spinSleepTime!=='number')&&!self.forceRestart){ letChildDie(); } elseif(spinning){ setTimeout(restartChild,self.spinSleepTime); } else{ restartChild(); } });
逻辑很简单,分别两个场景,一个是希望子进程不要再启动,一般就是外部控制杀死的;一个是意外退出后的重启,此处与一个spinning值的判断,也就是在退出后存在一个重启的时间间隔。
父子进程通信
message事件来监听,用send方法来发送事件,父子进程通信就可以用做外部的控制的实现了。这里我们还需要注意一个细节,就是node后端服务运行中会输出很多的日志,此时放在子进程中的控制台输出,如果希望暴露出来就可以使用options.stdio属性。
总结
保活的场景很多,这里可以使用forever库来处理,配合监控和日志功能,更好的保证线上环境的稳定。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。