代码之家  ›  专栏  ›  技术社区  ›  loretoparisi

如何自定义node.js集群

  •  0
  • loretoparisi  · 技术社区  · 6 年前

    我的node.js应用程序具有主/工作群集体系结构。

    基本上是我的跑步脚本 run.js 就像

    'use strict';
    (function() {
    
    /// node clustering
    const cluster = require('cluster');
    const numCPUs = require('os').cpus().length;
    
    if (cluster.isMaster) { // master node
        var masterConfig=require('./config/masterconfig.json');
    
        // Fork workers.
        var maxCPUs = process.env.WORKER_NUM || masterConfig.cluster.worker.num;
        maxCPUs=(maxCPUs>numCPUs)?numCPUs:maxCPUs;
    
        for (let i = 0; i < maxCPUs; i++) {
            const worker=cluster.fork();
        }
    
        var MasterNode=require('./lib/master');
        var master= new MasterNode(masterConfig);
        master.start()
        .then(done=> {
            console.log(`Master ${process.pid} running on ${masterConfig.pubsub.node}`);
        })
        .catch(error=> { // cannot recover from master error
            console.error(`Master ${process.pid} error`,error.stack);
            process.exit(1);
        });
    }
    else if (cluster.isWorker) { // worker node
        var workerConfig=require('./config/workerconfig.json');
        var WorkerNode=require('./lib/worker');
        var worker= new WorkerNode(workerConfig);
        worker.start()
        .then(done=> {
            console.log(`Worker ${process.pid} running on ${workerConfig.pubsub.node}`);
        })
        .catch(error=> { // worker error is recoverable
            console.error(`Worker ${process.pid} error`,error.stack);
        });
    }
    
    }).call(this);
    

    我在master和workers节点上都启动了一个http服务器。当工人监听端口3000时,主服务器监听端口3001,该端口将映射到Docker容器实例上的8080:

    [D O C K E R: 8080] --- N ---> [W O R K E R: 3001 ]  --- 1 ---> [M A S T E R: 3000]
    

    因此,在端口3001监听工作者的dispatcher api将在需要时将请求转发到主机上的端口3000(例如,仅用于在主机实例上运行的服务)。 所有主/工作节点共享相同的代码基,但有些模块在主节点上加载一次,而其他模块在所有工作模块上复制,因此我有如下内容:

    root/
     |
     lib/
     package.json
     --- master.js
     --- worker.js
     --- run.js
    

    默认情况下,节点集群使用循环方法跨工作进程分发请求,该方法基于 child_process_fork :

    The cluster module supports two methods of distributing incoming connections.
    The first one (and the default one on all platforms except Windows), is the round-robin approach, where the master process listens on a port, accepts new connections and distributes them across the workers in a round-robin fashion, with some built-in smarts to avoid overloading a worker process.
    

    here 更多细节。 我想获得对这个体系结构的更多控制,比如有一种方法来定义自定义排队机制,而不是循环,或者将我当前的设置迁移到一些流程管理工具,比如 PM2 不改变整个应用程序。

    0 回复  |  直到 6 年前