[Node.js] Availability and Zero-downtime Restarts
It might be possible for our node server has some downtime, no matter it is because server update or simply some crashs in the code. We want to minizie the downtime as much as possible.
1. In case of cluster worker crash, we want master worker fork a new worker:
const http = require('http');
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
    const cpus = os.cpus().length;
    console.log(`Forking for ${cpus} CPUs`);
    for (let i = ; i < cpus; i++) {
        cluster.fork();
    }
    cluster.on('exit', (worker, code, signal) => {
        if (code !== 0 && !worker.exitedAfterDisconnect) {
            console.log(`Worker ${worker.id} crashed. Starting a new wroker`);
            cluster.fork();
        }
    })
} else {
    require('./server');
}
It is important to check 'worker.exitedAfterDisconnect' to see whether is is because crash or because we want to exit one worker.
2. In case of upgrade, we want to restart each worker one by one, to make zero downtime:
// kill -SIGUSR2 <MASTER_PID>
// In case to upgrade, we want to restart each worker one by one
process.on('SIGUSR2', () => {
const workers = Object.values(cluster.workers);
const restartWorker = (workerIndex) => {
const worker = cluster.workers[workerIndex];
if (!worker) return; // On worker exit, we want to restart it, then continue
// with next worker
worker.on('exit', () => {
// If it is because crash, we don't continue
if (!worker.exitedAfterDisconnect) return;
console.log(`Exited process ${worker.process.pid}`);
cluster.fork().on('listening', () => {
restartWorker(workerIndex + );
}); worker.disconnect();
});
}
// Calling restartWorker recursively
restartWorker();
});
In really production, we don't actually need to code cluster by ourselve, we can use PM2 package. but it is important to understand what's happening under hood.
---
const cluster = require('cluster');
const http = require('http');
const os = require('os');
// For runing for the first time,
// Master worker will get started
// Then we can fork our new workers
if (cluster.isMaster) {
    const cpus = os.cpus().length;
    console.log(`Forking for ${cpus} CPUs`);
    for (let i = ; i < cpus; i++) {
        cluster.fork();
    }
    // In case of crash, we want to strat a new worker
    cluster.on('exit', (worker, code, signal) => {
        if (code !==  && !worker.exitedAfterDisconnect) {
            console.log(`Worker ${worker.id} crashed. Starting a new wroker`);
            cluster.fork();
        }
    })
    // kill -SIGUSR2 <MASTER_PID>
    // In case to upgrade, we want to restart each worker one by one
    process.on('SIGUSR2', () => {
        const workers = Object.values(cluster.workers);
        const restartWorker = (workerIndex) => {
            const worker = cluster.workers[workerIndex];
            if (!worker) return;
            // On worker exit, we want to restart it, then continue
            // with next worker
            worker.on('exit', () => {
                // If it is because crash, we don't continue
                if (!worker.exitedAfterDisconnect) return;
                console.log(`Exited process ${worker.process.pid}`);
                cluster.fork().on('listening', () => {
                    restartWorker(workerIndex + );
                });
                worker.disconnect();
            });
        }
        // Calling restartWorker recursively
        restartWorker();
    });
} else {
    require('./server');
}
[Node.js] Availability and Zero-downtime Restarts的更多相关文章
- [转]Getting Start With Node.JS Tools For Visual Studio
		本文转自:http://www.c-sharpcorner.com/UploadFile/g_arora/getting-started-with-node-js-tools-for-visual-s ... 
- Understanding Asynchronous IO With Python 3.4's Asyncio And Node.js
		[转自]http://sahandsaba.com/understanding-asyncio-node-js-python-3-4.html Introduction I spent this su ... 
- [Server Running] [Node.js, PM2] Using PM2 To Keep Your Node Apps Alive
		PM2 is a production process manager for Node.js applications with a built-in load balancer. It allow ... 
- Node.js(day5)
		一.NOSQL NOSQL是Not Only SQL的简称,与关系型数据库对应,一般称为非关系型数据库.关系型数据库遵循ACID规则,而NOSQL存储数据时不需要严格遵循固定的模式,因此在大数据的今天 ... 
- Four Node.js Gotchas that Operations Teams Should Know about
		There is no doubt that Node.js is one of the fastest growing platforms today. It can be found at sta ... 
- Node.js 操作Mongodb
		Node.js 操作Mongodb1.简介官网英文文档 https://docs.mongodb.com/manual/ 这里几乎什么都有了MongoDB is open-source docum ... 
- node.js使用cluster实现多进程
		首先郑重声明: nodeJS 是一门单线程!异步!非阻塞语言! nodeJS 是一门单线程!异步!非阻塞语言! nodeJS 是一门单线程!异步!非阻塞语言! 重要的事情说3遍. 因为nodeJS天生 ... 
- node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理
		一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ... 
- 利用Node.js的Net模块实现一个命令行多人聊天室
		1.net模块基本API 要使用Node.js的net模块实现一个命令行聊天室,就必须先了解NET模块的API使用.NET模块API分为两大类:Server和Socket类.工厂方法. Server类 ... 
随机推荐
- Java与GIS的联系
			Java与GIS的联系 地理信息系统是70年代初发展起来的一门新兴的边缘学科. 由于GIS在数据采集与输入.空间数据管理.地图提取.自动制图.数字地形分析.数据输出等方面具有强大而又独特的功能 ... 
- poj 2777 线段树 区间更新+位运算
			题意:有一个长板子,分成多段,有两种操作,第一种是C给从a到b那段染一种颜色c,另一种是P询问a到b有多少种不同的颜色.Sample Input2 2 4 板长 颜色数目 询问数目C 1 1 2P ... 
- MVC基类控制器的会话丢失重新登录权限过滤
			SSOController.cs请查看以下代码: public class SSOController : Controller { public const string Token = " ... 
- 读书笔记_Effective_C++_条款三十七:绝不重新定义继承而来的缺省参数值
			先看下面的例子: enum MyColor { RED, GREEN, BLUE, }; class Shape { public: ; }; class Rectangle: public Shap ... 
- Maven最佳实践 划分模块 配置多模块项目 pom modules
			所有用Maven管理的真实的项目都应该是分模块的,每个模块都对应着一个pom.xml.它们之间通过继承和聚合(也称作多模块,multi-module)相互关联.那么,为什么要这么做呢?我们明明在开发一 ... 
- Python基础教程学习(三)
			如何定义类 class ClassName(base_class[es]): "optional documentation string" static_member_decla ... 
- rac 10g 10.2.0.1升级到10.2.0.5具体解释
			RAC 10.2.0.1 升级到 10.2.0.5 一. 准备: Patch 包:p8202632_10205_LINUX.zip 节点数:3个节点 RAC1 RAC2 ... 
- 如何在发型不乱的前提下应对单日十亿计Web请求
			原文地址:http://developer.51cto.com/art/201502/464640.htm 就在不久之前,AppLovin移动广告平台的单一广告请求数量突破了200亿大关——相当于每一 ... 
- Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件:
			Http请求之基于HttpUrlConnection,支持Header,Body传值,支持Multipart上传文件: public static String post(String actionU ... 
- 算法:堆排序(Heap Sort)
			备注 考虑到 Heap 的特性,很容易想到将其用作排序的用处,为了提高效率需要适当的改进一下,如:in place remove 和 in place move down. 代码 using Syst ... 
