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 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
如何用js控制css中的float的代码
Aug 16 Javascript
轻松实现Bootstrap图片轮播
Apr 20 Javascript
javascript特殊日历控件分享
Mar 07 Javascript
jQuery层次选择器用法示例
Sep 09 Javascript
使用bootstrapValidator插件进行动态添加表单元素并校验
Sep 28 Javascript
Bootstrap路径导航与分页学习使用
Feb 08 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
Nov 16 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
Jan 09 Javascript
Vue 使用typescript如何优雅的调用swagger API
Sep 01 Javascript
OpenLayers3实现地图显示功能
Sep 25 Javascript
jQuery实现放大镜案例
Oct 19 jQuery
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实现统计邮件大小的方法
2013/08/06 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
js综合应用实例简单的表格统计
2013/09/03 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
用Vue.js实现监听属性的变化
2016/11/17 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
微信小程序日历组件calendar详解及实例
2017/06/08 Javascript
bootstrap treeview 扩展addNode方法动态添加子节点的方法
2017/11/21 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
Python下rrdtool模块的基本使用方法
2015/11/13 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
python中reload(module)的用法示例详解
2017/09/15 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
python连接mongodb密码认证实例
2018/10/16 Python
Python数据分析:手把手教你用Pandas生成可视化图表的教程
2018/12/15 Python
Python使用APScheduler实现定时任务过程解析
2019/09/11 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
python手写均值滤波
2020/02/19 Python
python 模拟登录B站的示例代码
2020/12/15 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
老公给老婆的道歉信
2014/01/10 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
3分钟演讲稿
2014/04/30 职场文书
学生会竞选演讲稿怎么写
2014/08/26 职场文书
大雁塔英文导游词
2015/02/10 职场文书
公司业务员管理制度
2015/08/05 职场文书
AJAX学习笔记
2021/05/18 Javascript
python tqdm用法及实例详解
2021/06/16 Python
Arthas排查Kubernetes中应用频繁挂掉重启异常
2022/02/28 MySQL
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python