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的三种$()
Dec 30 Javascript
extJs 下拉框联动实现代码
Apr 09 Javascript
editable.js 基于jquery的表格的编辑插件
Oct 24 Javascript
jquery鼠标滑过提示title具体实现代码
Aug 06 Javascript
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
javascript中cookie对象用法实例分析
Jan 30 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
Jun 06 Javascript
深入理解js generator数据类型
Aug 16 Javascript
Vue.js搭建移动端购物车界面
Jun 28 Javascript
Angular父子组件通过服务传参的示例方法
Oct 31 Javascript
解决layui数据表格table的横向滚动条显示问题
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
百度实时推送api接口应用示例
2014/10/21 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
Yii2.0建立公共方法简单示例
2019/01/29 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
js的toLowerCase方法用法实例
2015/01/27 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
简单了解微信小程序 e.target与e.currentTarget的不同
2019/09/27 Javascript
微信小程序实现单个卡片左滑显示按钮并防止上下滑动干扰功能
2019/12/06 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
python 把数据 json格式输出的实例代码
2016/10/31 Python
浅谈Python实现Apriori算法介绍
2017/12/20 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
python logging模块的使用总结
2019/07/09 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的代码
2020/11/30 HTML / CSS
Mankind西班牙男士护肤品网站:购买皮肤护理、护发和剃须
2017/04/27 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
东方红海科技面试题软件测试方面
2012/02/08 面试题
医院办公室主任职责
2013/12/29 职场文书
小学优秀教师材料
2014/12/15 职场文书
军事理论课感想
2015/08/11 职场文书
门面租赁合同范文
2019/08/06 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers
Nginx虚拟主机的搭建的实现步骤
2022/01/18 Servers
CSS3实现指纹特效代码
2022/03/17 HTML / CSS