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精华代码集
Jan 24 Javascript
Notify - 基于jquery的消息通知插件
Oct 18 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
Oct 20 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
Oct 23 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
JAVA中截取字符串substring用法详解
Apr 14 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
使用webpack3.0配置webpack-dev-server教程
May 29 Javascript
微信小程序文章详情页面实现代码
Sep 10 Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 Javascript
js实现的格式化数字和金额功能简单示例
Jul 30 Javascript
JS常见错误(Error)及处理方案详解
Jul 02 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
写一个用户在线显示的程序
2006/10/09 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
php实现paypal 授权登录
2015/05/28 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
ext for eclipse插件安装方法
2008/04/27 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
解析Javascript中难以理解的11个问题
2013/12/09 Javascript
js打开新窗口方法整理
2014/02/17 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
Javascript学习笔记之函数篇(四):arguments 对象
2014/11/23 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
jQuery插件HighCharts绘制2D带有Legend的饼图效果示例【附demo源码下载】
2017/03/10 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
微信小程序模板template简单用法示例
2018/12/04 Javascript
express框架中使用jwt实现验证的方法
2019/08/25 Javascript
Vue-Cli项目优化操作的实现
2019/10/27 Javascript
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
Python列表list解析操作示例【整数操作、字符操作、矩阵操作】
2017/07/25 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
Python多线程原理与用法详解
2018/08/20 Python
Django 外键的使用方法详解
2019/07/19 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
自主实习接收函
2014/01/13 职场文书
歌唱比赛主持词
2014/03/18 职场文书
房屋出租协议书
2014/04/10 职场文书
疾病捐款倡议书
2014/05/13 职场文书
软件测试专业推荐信
2014/09/18 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书