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 相关文章推荐
Dom加载让图片加载完再执行的脚本代码
May 15 Javascript
JQuery中getJSON的使用方法
Dec 13 Javascript
Jquery Ajax请求代码(2)
Jan 07 Javascript
jQuery学习笔记之控制页面实现代码
Feb 27 Javascript
window.print打印指定div指定网页指定区域的方法
Aug 04 Javascript
js对象的复制继承实例
Jan 10 Javascript
Jquery 垂直多级手风琴菜单附源码下载
Nov 17 Javascript
复杂的javascript窗口分帧解析
Feb 19 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
Mar 07 Javascript
js实现省份下拉菜单效果
Feb 15 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
Aug 13 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
Jan 28 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
MVC模式的PHP实现
2006/10/09 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
深入分析php之面向对象
2013/05/15 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
PHP微信分享开发详解
2017/01/14 PHP
php+resumablejs实现的分块上传 断点续传功能示例
2017/04/18 PHP
javascript 对象的定义方法
2007/01/10 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
javascript读写json示例
2014/04/11 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
浅谈javascript原型链与继承
2015/07/13 Javascript
JS简单实现移动端日历功能示例
2016/12/28 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
JS实现压缩上传图片base64长度功能
2019/12/03 Javascript
vue开发中遇到的问题总结
2020/04/07 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
python简单贪吃蛇开发
2019/01/28 Python
python初步实现word2vec操作
2020/06/09 Python
使用Python提取文本中含有特定字符串的方法示例
2020/12/09 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
潘多拉意大利官方网上商城:网上选购PANDORA珠宝
2018/10/07 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
英语自荐信常用语句
2013/12/13 职场文书
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
数学检讨书1000字
2014/02/24 职场文书
搞笑结婚保证书
2015/05/08 职场文书
办公用品质量保证书
2015/05/11 职场文书
辞职信怎么写?
2019/05/21 职场文书
Nginx搭建rtmp直播服务器实现代码
2021/03/31 Servers
【海涛解说】暗牧也疯狂,牛蛙成配角
2022/04/01 DOTA