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 相关文章推荐
封装了一个js图片轮换效果的函数
Sep 28 Javascript
$.getJSON在IE下失效的原因分析及解决方法
Jun 16 Javascript
用jquery方法操作radio使其默认选项是否
Sep 10 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
全面理解JavaScript中的闭包
May 12 Javascript
Vue.js快速入门教程
Sep 07 Javascript
实例解析js中try、catch、finally的执行规则
Feb 24 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
vue将单页面改造成多页面应用的方法
Nov 25 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
Dec 04 jQuery
详解实现一个通用的“划词高亮”在线笔记功能
Apr 23 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实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
redis查看连接数及php模拟并发创建redis连接的方法
2016/12/15 PHP
PHP获取文件扩展名的方法实例总结
2017/06/10 PHP
一段实时更新的时间代码
2006/07/07 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
JS生成随机字符串的多种方法
2014/06/10 Javascript
jQuery使用contains过滤器实现精确匹配方法详解
2016/02/25 Javascript
Three.js快速入门教程
2016/09/09 Javascript
理解JavaScript原型链
2016/10/25 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
如何为你的JS项目添加智能提示与类型检查详解
2019/03/12 Javascript
微信小程序生成二维码的示例代码
2019/03/29 Javascript
Angular8引入百度Echarts进行图表分析的实现代码
2019/11/27 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
python抓取京东商城手机列表url实例代码
2013/12/18 Python
用C++封装MySQL的API的教程
2015/05/06 Python
Python 函数基础知识汇总
2018/03/09 Python
Django中的cookie和session
2019/08/27 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
Python之字符串的遍历的4种方式
2020/12/08 Python
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
韩国爱茉莉太平洋化妆品美国站:Amore Pacific US
2016/10/28 全球购物
领导党性分析材料
2014/02/15 职场文书
学校三八妇女节活动情况总结
2014/03/09 职场文书
网络优化专员求职信
2014/05/04 职场文书
企业趣味活动方案
2014/08/21 职场文书
2014年幼儿园小班工作总结
2014/12/04 职场文书
2015年体检中心工作总结
2015/05/27 职场文书