当前位置: 首页 > 后端技术 > Node.js

Node后台服务保活

时间:2023-04-03 23:19:03 Node.js

介绍目前项目使用node作为一个简单的后台服务。随着其承担越来越多的在线业务服务,对服务器的稳定性提出了要求,其中最重要的一点就是保持服务的存活。它具有在进程终止后自动重新启动的能力。foreverforever是一个简单的命令行工具,可确保给定的脚本继续运行。forever完全基于命令行操作。在forever进程下,创建一个node子进程,通过monitor监控node子进程的运行状态。一旦文件更新或进程挂起,forever会自动重启节点服务器,保证应用的正常运行。所以只要看看永远的项目。主要流程控制方面的代码地址。启动方法letchild_process=require('child_process')letspawn=child_process.spawnMonitor.prototype.start=function(restart){varself=this,child;child=this.trySpawn();...返回这个;};Monitor.prototype.trySpawn=function(){varrun=this.parser(this.command,this.args.slice()),stats;返回spawn(run.command,run.args,this.spawnWith);};核心是利用nodeapi中的spawn创建子进程,也就是我们真正需要运行的node端服务。自动重启父子进程通信的核心是保活,主要是监听子进程,也就是需要守护的退出事件。child.on('exit',function(code,signal){varspinning=Date.now()-self.ctime=self.max&&!self.forceRestart)||(旋转&&typeofself.spinSleepTime!=='number')&&!self.forceRestart){letChildDie();}elseif(spinning){setTimeout(restartChild,self.spinSleepTime);}else{restartChild();}});逻辑很简单。有两种情况。死的;一是意外退出后重启,这里是判断一个自旋值,即退出后有一个重启时间间隔。父子进程通信消息事件用于监听,使用send方法发送事件,父子进程通信可以作为对外控制的实现。这里我们还需要注意一个细节,就是node后台服务在运行的时候,会输出很多日志。此时控制台输出放在子进程中,如果想暴露它,可以使用options.stdio属性。综上所述,保活场景有很多种。这里可以使用forever库来处理,配合监控和日志功能,更好的保证线上环境的稳定。