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 相关文章推荐
增强的 JavaScript 的 trim 函数的代码
Aug 13 Javascript
Juqery Html(),append()等方法的Bug解决方法
Dec 13 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
Sep 02 Javascript
JS Loading功能的简单实现
Nov 29 Javascript
JS弹出层的显示与隐藏示例代码
Dec 27 Javascript
Bootstrap 组件之按钮(二)
May 11 Javascript
JavaScript 数组some()和filter()的用法及区别
May 20 Javascript
jQuery实现选项卡功能(两种方法)
Mar 08 Javascript
JS正则替换去空格的方法
Mar 24 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
Apr 21 Javascript
bootstrap响应式表格实例详解
May 15 Javascript
在layui下对元素进行事件绑定的实例
Sep 06 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和ACCESS写聊天室(五)
2006/10/09 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
PHP实现添加购物车功能
2017/03/06 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
2015/06/26 Javascript
javascript实现复选框全选或反选
2017/02/04 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
AngularJS监听路由变化的方法
2017/03/07 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
2018/08/22 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
[33:23]VG vs Pain 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python运行报错UnicodeDecodeError的解决方法
2016/06/07 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
2016/06/13 Python
python pandas 对时间序列文件处理的实例
2018/06/22 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
flask应用部署到服务器的方法
2019/07/12 Python
python 内置函数汇总详解
2019/09/16 Python
Python 远程开关机的方法
2020/11/18 Python
Python实现迪杰斯特拉算法并生成最短路径的示例代码
2020/12/01 Python
CSS3 @font-face属性使用指南
2014/12/12 HTML / CSS
港湾网络笔试题
2014/04/19 面试题
医院总经理职责
2013/12/26 职场文书
乔迁之喜主持词
2014/03/27 职场文书
归元寺导游词
2015/02/06 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
Nginx反向代理配置的全过程记录
2021/06/22 Servers
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers