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的AngularJS框架中指令的使用方法
Mar 05 Javascript
利用BootStrap弹出二级对话框的简单实现方法
Sep 21 Javascript
javascript 分号总结及详细介绍
Sep 24 Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
Jul 31 Javascript
JS使用正则表达式获取小括号、中括号及花括号内容的方法示例
Jun 01 Javascript
Vue实现用户自定义字段显示数据的方法
Aug 28 Javascript
webpack实现一个行内样式px转vw的loader示例
Sep 13 Javascript
vue实现带复选框的树形菜单
May 27 Javascript
js实现带有动画的返回顶部
Aug 09 Javascript
React如何创建组件
Jun 27 Javascript
vue实现登陆页面开发实践
May 30 Vue.js
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执行速度全攻略(上)
2006/10/09 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
JavaScript的eval JSON object问题
2009/11/15 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
微信小程序点击顶部导航栏切换样式代码实例
2019/11/12 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
使用python将mdb数据库文件导入postgresql数据库示例
2014/02/17 Python
使用Python的Tornado框架实现一个一对一聊天的程序
2015/04/25 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
python使用正则筛选信用卡
2019/01/27 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Python中顺序表原理与实现方法详解
2019/12/03 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
工厂厂长的职责
2013/12/12 职场文书
社区党总支书记先进事迹材料
2014/01/24 职场文书
高一化学教学反思
2014/02/05 职场文书
个性发展自我评价
2014/02/11 职场文书
小学安全教育材料
2014/02/17 职场文书
迎元旦广播稿
2014/02/22 职场文书
人代会标语
2014/06/30 职场文书
学习型家庭事迹材料
2014/12/20 职场文书