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 09 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
Feb 22 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
Feb 01 Javascript
如何判断出一个js对象是否一个dom对象
Nov 24 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
基于react后端渲染模板引擎noox发布使用
Jan 11 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
Jul 24 jQuery
Vue+Django项目部署详解
May 30 Javascript
小程序实现锚点滑动效果
Sep 23 Javascript
javascript随机变色实例代码
Oct 15 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 Javascript
关于小程序优化的一些建议(小结)
Dec 10 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设计模式之装饰者模式
2012/02/29 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
2015/03/17 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
PHP Reflection API详解
2015/05/12 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
动态为事件添加js代码示例
2009/02/15 Javascript
jquery tools之tooltip
2009/07/25 Javascript
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
JQuery制作的放大效果的popup对话框(未添加任何jquery plugin)分享
2013/04/28 Javascript
jQuery获得内容和属性方法及示例
2013/12/02 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
JavaScript实现自动对页面上敏感词进行屏蔽的方法
2015/07/27 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
2015/08/04 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
详解vue移动端日期选择组件
2018/02/22 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
[02:27]2018DOTA2亚洲邀请赛趣味视频之钓鱼大赛 谁是垂钓冠军?
2018/04/05 DOTA
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python查询IP地址归属完整代码
2017/06/21 Python
Python编程之变量赋值操作实例分析
2017/07/24 Python
理论讲解python多进程并发编程
2018/02/09 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python将字符串常量转化为变量方法总结
2019/03/17 Python
python实现动态创建类的方法分析
2019/06/25 Python
python爬虫工具例举说明
2020/11/30 Python
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
地理科学专业毕业生求职信
2013/10/15 职场文书
四川成都导游欢迎词
2014/01/18 职场文书
MySQL分区表管理命令汇总
2022/03/21 MySQL
Python 数据可视化工具 Pyecharts 安装及应用
2022/04/20 Python