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 相关文章推荐
解决表单中第一个非隐藏的元素获得焦点的一个方案
Oct 26 Javascript
javascript的渐进增强与平稳退化浅谈
Nov 12 Javascript
jQuery Masonry瀑布流插件使用详解
Nov 17 Javascript
Angular ui.bootstrap.pagination分页
Jan 20 Javascript
Vue 项目部署到服务器的问题解决方法
Dec 05 Javascript
基于jquery实现左右上下移动效果
May 02 jQuery
vuex如何重置所有state(可定制)
Jan 17 Javascript
通过JS运行机制的角度说说作用域
Mar 12 Javascript
Vue.js仿Select下拉框效果
Feb 18 Javascript
Vue自动构建发布脚本的方法示例
Jul 24 Javascript
JavaScript this关键字指向常用情况解析
Sep 02 Javascript
js实现头像上传并且可预览提交
Dec 25 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
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
2009/05/25 Javascript
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
对于this和$(this)的个人理解
2013/09/08 Javascript
js 打开新页面在屏幕中间的实现方法
2016/11/02 Javascript
vue2笔记 — vue-router路由懒加载的实现
2017/03/03 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
vue引入新版 vue-awesome-swiper插件填坑问题
2018/01/25 Javascript
浅谈VUE监听窗口变化事件的问题
2018/02/24 Javascript
layui 关闭open弹出框 刷新table表格页面的方法
2019/09/16 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
vue动态合并单元格并添加小计合计功能示例
2020/11/26 Vue.js
[06:13]DOTA2进化论(修改版)
2013/10/08 DOTA
[50:44]DOTA2-DPC中国联赛 正赛 SAG vs Dragon BO3 第二场 2月22日
2021/03/11 DOTA
python获取标准北京时间的方法
2015/03/24 Python
Python设计模式中单例模式的实现及在Tornado中的应用
2016/03/02 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
虚拟机下载python是否需要联网
2020/07/27 Python
css3中单位px,em,rem,vh,vw,vmin,vmax的区别及浏览器支持情况
2016/12/06 HTML / CSS
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
德国原装品牌香水、化妆品和手表网站:BRASTY.DE
2016/10/16 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
酒店门卫岗位职责
2013/12/29 职场文书
生产部主管岗位职责
2014/01/06 职场文书
大学自我评价
2014/02/12 职场文书
网络研修随笔感言
2014/02/17 职场文书
会计演讲稿范文
2014/05/23 职场文书
活动总结范文
2014/08/30 职场文书
2014年党建工作汇报材料
2014/11/02 职场文书
2014年保卫部工作总结
2014/11/21 职场文书
2015年检验科工作总结
2015/04/27 职场文书
入党积极分子培养联系人意见
2015/08/12 职场文书
小学英语课教学反思
2016/02/15 职场文书
《悬崖边的树》读后感2篇
2019/12/02 职场文书