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 相关文章推荐
extjs fckeditor集成代码
May 10 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
基于jQuery实现左右图片轮播(原理通用)
Dec 24 Javascript
使用BootStrap实现悬浮窗口的效果
Dec 13 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 Javascript
npm scripts 使用指南详解
Oct 08 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
Oct 09 Javascript
ES6 对象的新功能与解构赋值介绍
Feb 05 Javascript
js尾调用优化的实现
May 23 Javascript
JS 自执行函数原理及用法
Aug 05 Javascript
vue实现短信验证码输入框
Apr 17 Javascript
vue在响应头response中获取自定义headers操作
Jul 24 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
2020显卡排行榜天梯图 显卡天梯图2020年3月最新版
2020/04/02 数码科技
PHP个人网站架设连环讲(三)
2006/10/09 PHP
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
ext读取两种结构的xml的代码
2008/11/05 Javascript
浅谈Javascript嵌套函数及闭包
2010/11/09 Javascript
最短的IE判断代码
2011/03/13 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
JavaScript中windows.open()、windows.close()方法详解
2016/07/28 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
原生js实现form表单序列化的方法
2018/08/02 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
electron踩坑之dialog中的callback解决
2020/10/06 Javascript
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
2016/07/04 Python
python实现报表自动化详解
2017/11/16 Python
Python实现的维尼吉亚密码算法示例
2018/04/12 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
使用Python实现在Windows下安装Django
2018/10/17 Python
python中@property和property函数常见使用方法示例
2019/10/21 Python
澳大利亚个性化儿童礼品网站:Bright Star Kids
2019/06/14 全球购物
《诚实与信任》教学反思
2014/04/10 职场文书
《云房子》教学反思
2014/04/20 职场文书
协议书的格式
2014/04/23 职场文书
护士演讲稿优秀范文
2014/04/30 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
小石潭记导游词
2015/02/03 职场文书
单位工作证明范本
2015/06/15 职场文书
军训新闻稿范文
2015/07/17 职场文书
小学英语教师研修感悟
2015/11/18 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
MySQL数据库索引的最左匹配原则
2021/11/20 MySQL
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS
MySQL三种方式实现递归查询
2022/04/18 MySQL