Как настроить Node.js кластер - PullRequest
0 голосов
/ 01 октября 2018

Мое приложение 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);

Я запускаю как на мастер, так и нарабочие узел HTTP-сервер.Пока рабочие прослушивают порт 3000, мастер прослушивает порт 3001, который будет сопоставлен с 8080 в экземпляре контейнера докера:

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

Таким образом, диспетчерский API, прослушивающий WORKER в порту 3001, будетпри необходимости перенаправляйте запросы на порт 3000 на устройстве MASTER (например, для служб, работающих только на главном экземпляре).Все узлы MASTER / WORKER совместно используют одну и ту же кодовую базу, но некоторые модули загружаются один раз на MASTER, в то время как другие модули дублируются на всех модулях WORKER, поэтому у меня есть что-то вроде:

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

По умолчанию Node cluster использует кластерциклический подход к распределению запросов между работниками, основанный на 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.

См. здесь для получения более подробной информации.Я хотел бы получить больший контроль над этой архитектурой, например, иметь возможность определять собственный механизм очередей, а не циклический перебор, или перенести мою текущую настройку в какой-либо инструмент управления процессами, например PM2 , без изменения всего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...