集群的另一个用途是高可用。

当集群启动时,会有多个进程,只要其中任何一个进程存活,程序就可正常提供服务。而且,我们可以实现:当某个进程意外中止时,自动重启之。以此达到程序“不死”的效果。

且看代码:

const cluster = require("cluster");
const os = require("os");

//主进程
if(cluster.isMaster){

    //cpu数量(几核)
    const cpus = os.cpus().length;
    console.log(`Clustering to ${cpus} CPUS`);

    for(let i=0i<cpusi++){

        //分派子进程
        cluster.fork();
    }

    //如果工作进程关闭了,重启一个
    cluster.on("exit",function(worker,code){
        if(code != 0 && !worker.suicide){
            console.log("worker crashed. Starting a new worker");
            cluster.fork();
        }
    });
}else{
    //子进程执行内容

    const http = require("http");
    const pid = process.pid;
    
    http.createServer(function(req,res){
        console.log(`Handing request from ${pid}`);
        res.end(`Hello from ${pid}\n`);
    }).listen(8000,function(){
        console.log(`Started ${pid}`);
    })

    //秒数后触发,主动抛出一个错误
    setTimeout(function(){
        throw new Error("ooops");
    },Math.ceil(Math.random()*3) * 1000);
}

此代码,会在启动后数秒抛出错误,当发生错误、程序退出时,主进程会自动重启一个工作进程。

效果如下: