node后端服务保活的实现


Posted in Javascript onNovember 10, 2019

引言

目前的项目中使用了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库来处理,配合监控和日志功能,更好的保证线上环境的稳定。

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

Javascript 相关文章推荐
用js实现的模拟jquery的animate自定义动画(2.5K)
Jul 20 Javascript
理解Javascript_12_执行模型浅析
Oct 18 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
Dec 11 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
jQuery焦点图切换特效代码分享
Sep 15 Javascript
javascript基于prototype实现类似OOP继承的方法
Dec 16 Javascript
浅谈jQuery before和insertBefore的区别
Dec 04 Javascript
jQuery、layer实现弹出层的打开、关闭功能
Jun 28 jQuery
详解Angular2学习笔记之Html属性绑定
Jan 03 Javascript
一文了解vue-router之hash模式和history模式
May 31 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 Javascript
vue动态循环出的多个select出现过的变为disabled(实例代码)
Nov 10 #Javascript
vue父子组件的通信方法(实例详解)
Nov 10 #Javascript
分享Angular http interceptors 拦截器使用(推荐)
Nov 10 #Javascript
vue-父子组件和ref实例详解
Nov 10 #Javascript
vue $set 给数据赋值的实例
Nov 09 #Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 #Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
Nov 09 #Javascript
You might like
php下批量挂马和批量清马代码
2011/02/27 PHP
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
浅析php header 跳转
2013/06/17 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
JQuery里选择超链接的实现代码
2011/05/22 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
2016/06/16 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
React实现双向绑定示例代码
2016/09/19 Javascript
浅谈jquery之on()绑定事件和off()解除绑定事件
2016/10/26 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
基于 flexible 的 Vue 组件:Toast -- 显示框效果
2017/12/26 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
2020/01/20 Javascript
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
2018/04/10 Python
使用Python编写Prometheus监控的方法
2018/10/15 Python
Python中的 is 和 == 以及字符串驻留机制详解
2019/06/28 Python
python 实现单通道转3通道
2019/12/03 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
python 实现屏幕录制示例
2019/12/23 Python
QML实现钟表效果
2020/06/02 Python
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
企业总经理职责
2014/02/02 职场文书
维修工先进事迹
2014/05/29 职场文书
车队安全员岗位职责
2015/02/15 职场文书
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android