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 相关文章推荐
javascript String 对象
Apr 25 Javascript
$.each遍历对象、数组的属性值并进行处理
Jul 18 Javascript
js判断浏览器是否支持html5
Aug 17 Javascript
再次谈论Javascript中的this
Jun 23 Javascript
让html元素随浏览器的大小自适应垂直居中的实现方法
Oct 12 Javascript
vuex实现简易计数器
Oct 27 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
详解vue静态资源打包中的坑与解决方案
Feb 05 Javascript
Vue加载组件、动态加载组件的几种方式
Aug 31 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
Aug 01 Javascript
node读写Excel操作实例分析
Nov 06 Javascript
vant 时间选择器--开始时间和结束时间实例
Nov 04 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
再次研究下cache_lite
2007/02/14 PHP
php开启安全模式后禁用的函数集合
2011/06/26 PHP
PHP生成随机密码类分享
2014/06/25 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
node.js中的fs.readdir方法使用说明
2014/12/17 Javascript
jQuery使用removeClass方法删除元素指定Class的方法
2015/03/26 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
2015/12/18 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
jquery及js实现动态加载js文件的方法
2016/01/21 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
Vue实例简单方法介绍
2017/01/20 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
Angular.JS中的this指向详解
2017/05/17 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
js实现点击选项置顶动画效果
2020/08/25 Javascript
[43:51]2014 DOTA2国际邀请赛中国区预选赛 Dream Times VS TongFu
2014/05/22 DOTA
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
Python读取Excel表格,并同时画折线图和柱状图的方法
2018/10/14 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
学校安全责任书
2014/04/14 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书