JavaScript

超轻量级php框架startmvc

node后端服务保活的实现

更新时间:2020-09-22 17:12:01 作者:startmvc
引言目前的项目中使用了node,作为一个简单的后端服务,随着承担着越来越多的线上业务

引言

目前的项目中使用了node,作为一个简单的后端服务,随着承担着越来越多的线上业务的服务,就要求了服务端的稳定性,而其中最重要的一点就是服务保活。有进程终止后自动重启的能力。

forever

forever是一个简单的命令行工具,他能确保一个给定的脚本持续运行。forever完全基于命令行操作,在forever进程之下,创建node的子进程,通过monitor监控node子进程的运行情况,一旦文件更新,或者进程挂掉,forever会自动重启node服务器,确保应用正常运行。

所以就看一下forever的项目吧。主要的进程控制方面的代码地址。

start方法


let child_process = require('child_process')
let spawn = child_process.spawn

Monitor.prototype.start = function (restart) {
 var self = this,
 child;

 child = this.trySpawn();

 ...
 return this;
};
Monitor.prototype.trySpawn = function () {
 var run = this.parser(this.command, this.args.slice()),
 stats;

 return spawn(run.command, run.args, this.spawnWith);
};

核心就是使用了node api 中的 spawn,创建子进程,这个子进程就是我们真正的需要运行的node端服务。

自动restart

父子进程的通信核心就是为了保活,主要就是监听了子进程,也就是需要被守护进程的exit事件


 child.on('exit', function (code, signal) {
 var spinning = Date.now() - self.ctime < self.minUptime;
 child.removeListener('message', onMessage);
 self.emit('exit:code', code, signal);

 function letChildDie() {
 self.running = false;
 self.forceStop = false;
 self.emit('exit', self, spinning);
 }

 function restartChild() {
 self.forceRestart = false;
 process.nextTick(function () {
 self.start(true);
 });
 }

 self.times++;

 if (self.forceStop || (self.times >= self.max && !self.forceRestart)
 || (spinning && typeof self.spinSleepTime !== 'number') && !self.forceRestart) {
 letChildDie();
 }
 else if (spinning) {
 setTimeout(restartChild, self.spinSleepTime);
 }
 else {
 restartChild();
 }
 });

逻辑很简单,分别两个场景,一个是希望子进程不要再启动,一般就是外部控制杀死的;一个是意外退出后的重启,此处与一个spinning值的判断,也就是在退出后存在一个重启的时间间隔。

父子进程通信

message事件来监听,用send方法来发送事件,父子进程通信就可以用做外部的控制的实现了。这里我们还需要注意一个细节,就是node后端服务运行中会输出很多的日志,此时放在子进程中的控制台输出,如果希望暴露出来就可以使用options.stdio属性。

总结

保活的场景很多,这里可以使用forever库来处理,配合监控和日志功能,更好的保证线上环境的稳定。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

node 服务保活 node 后端服务保活