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 setCapture 区域外事件捕捉
Mar 18 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 Javascript
javascript date格式化示例
Sep 25 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
微信小程序 使用canvas制作K线实例详解
Jan 12 Javascript
js操作浏览器的参数方法
Jan 21 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
了解ESlint和其相关操作小结
May 21 Javascript
JS实现仿微信支付弹窗功能
Jun 25 Javascript
解决layer.msg 不居中 ifram中的问题
Sep 05 Javascript
基于vue中的scoped坑点解说
Sep 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
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
javascript常用对话框小集
2013/09/13 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
Jquery实现点击按钮,连续地向textarea中添加值的实例代码
2014/03/08 Javascript
使用jquery实现IE下按backspace相当于返回操作
2014/03/18 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
javascript中Object使用详解
2015/01/26 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
canvas实现动态小球重叠效果
2017/02/06 Javascript
基于JavaScript实现复选框的全选和取消全选
2017/02/09 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
微信小程序 chooseImage选择图片或者拍照
2017/04/07 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
浅谈Python单向链表的实现
2015/12/24 Python
Python实现读取字符串按列分配后按行输出示例
2018/04/17 Python
python实现决策树分类
2018/08/30 Python
Windows 64位下python3安装nltk模块
2018/09/19 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
在django view中给form传入参数的例子
2019/07/19 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
美国钻石商店:Zales
2016/11/20 全球购物
交通专业个人自荐信格式
2013/09/23 职场文书
教师自荐书
2013/10/08 职场文书
商场消防演习方案
2014/02/12 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
公司租房协议书范本
2014/10/08 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书