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 相关文章推荐
基于jQuery UI CSS Framework开发Widget的经验
Aug 21 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
每天一篇javascript学习小结(属性定义方法)
Nov 19 Javascript
jQuery插件实现多级联动菜单效果
Dec 01 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
JS获取checkbox的个数简单实例
Aug 19 Javascript
jQuery实现给input绑定回车事件的方法
Feb 09 Javascript
Vue2.x通用编辑组件的封装及应用详解
May 28 Javascript
JavaScript Array对象使用方法解析
Sep 24 Javascript
JavaScript实现Tab选项卡切换
Feb 13 Javascript
微信小程序实现日历签到
Sep 21 Javascript
jQuery实现全选按钮
Jan 01 jQuery
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
js调用flash的效果代码
2008/04/26 Javascript
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
js中符号转意问题示例探讨
2013/08/19 Javascript
原生javascript模仿win8等待提示圆圈进度条
2014/04/24 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
JS实现一个按钮的方法
2015/02/05 Javascript
jquery插件corner实现圆角边框的方法
2015/03/09 Javascript
超赞的动手创建JavaScript框架的详细教程
2015/06/30 Javascript
js中javascript:void(0) 真正含义
2020/11/05 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
javascript设计模式之单体模式学习笔记
2017/02/15 Javascript
bootstrap的常用组件和栅格式布局详解
2017/05/02 Javascript
jQuery DOM节点的遍历方法小结
2017/08/15 jQuery
JS数组操作之增删改查的简单实现
2017/08/21 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
js实现登录与注册界面
2017/11/01 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
python删除本地夹里重复文件的方法
2020/11/19 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
2020/02/16 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
如何基于Django实现上下文章跳转
2020/09/16 Python
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
期末评语大全
2014/05/04 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
初中作文评语集锦
2014/12/25 职场文书
初中数学教学反思范文
2016/02/17 职场文书
《水上飞机》教学反思
2016/02/20 职场文书
大学生,三分钟即兴演讲稿
2019/07/22 职场文书
python 模块重载的五种方法
2021/04/24 Python
压缩Redis里的字符串大对象操作
2021/06/23 Redis
详解Vue的列表渲染
2021/11/20 Vue.js