2015-12-24 2 views
5

У меня проблема с PM2 в NodeJS. Без PM2, у нас всегда есть несколько строк кода, как показано ниже, чтобы настроить мастер-процессКак мы можем настроить мастер-процесс при использовании PM2

if(cluster.isMaster){ 
    //master process configuration 
} else { 
    //worker process configuration 
} 

Точно, я хочу, чтобы отправить сообщение от рабочего до мастера, то мастер вышлет сообщение для всех работников для уведомления мероприятие.

Фактически, я видел, что при использовании PM2 не выполняются никакие строки кода в конфигурации основного процесса.

Большое спасибо за любую идею об этой проблеме!

ответ

6

С PM2 вам обычно не нужно использовать эту конструкцию. Как правило, это выглядит следующим образом:

var cluster = require('cluster'); 
var http = require('http'); 
var os  = require('os'); 
var numCPUs = os.cpus().length; 

if(cluster.isMaster){ 
    for (var i = 0; i < numCPUs; ++i) { 
    cluster.fork(); 
    } 
} else { 
    http.createServer(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world"); 
    }).listen(8080); 
} 

С PM2 эквивалент для выше:

var http = require('http'); 

http.createServer(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world"); 
}).listen(8080); 

pm2 start app.js -i <number of instances>

вы можете прочитать больше на эту тему here

Обновление: Вы можете попытаться провести различие между мастером и подчиненным, передав командную строку argum энтов. Вот пример ecosystem.json:

{ 
    "apps" : [ 
    { 
     "name": "Master", 
     "script": "app.js", 
     "args": ["master"], 
     "instances": "1", 
    }, 
    { 
     "name": "Slave", 
     "script": "app.js", 
     "args": ["slave"], 
     "instances": "3" 
    } 
    ], 
... 

Затем вы можете сделать следующее:

argv = process.argv.slice(2) //stripe 'node', 'app.js' away 

if (argv[0] === 'master'){ 
    // ... 
} else { 
    // ... 
} 
+0

PM2 просто помогает вилочным рабочим автоматически, но Вы не можете осуществить что-то вроде: worker.on («сообщения», MessageHandler) обработчика полученных сообщений от работника :( – thelonglqd

+1

было бы нормален для вас, чтобы породить «мастер» отдельно ? Это довольно неудобно, но добавление отдельной записи для master в экосистеме.json будет работать. PM2 позволяет указывать переменные env для экземпляров, которые могут помочь вам различать master и slave. – bublik42

0

PM2 внутренне использует «кластер», чтобы создать дочерние процессы, а затем сам выступает в качестве ведущего, а не обеспечить любую функцию снаружи. Вы можете использовать следующий код для создания процесса, но cluster.isMaster всегда был ложным.

if(cluster.isMaster){ 
    ... 
    cluster.fork(); 
    ... 
} else { 
    ... 
} 

Если вы не начать так: pm2 start -x app.jshttps://github.com/Unitech/pm2/issues/363

Конструкция PM2 хорошо, но это вносит путаницу новичкам. Мы делаем все возможное, чтобы посмотреть документы и поиск Google, но сложно найти какие-либо объяснения по поводу дизайна.

Смежные вопросы