2015-12-24 15 views
5

Ho un problema con PM2 in NodeJS. Senza PM2, abbiamo sempre alcune righe di codice come qui di seguito per configurare processo maestroCome configurare il processo master quando si utilizza PM2

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

Esattamente, voglio inviare un messaggio da un lavoratore di maestro, allora, maestro invierà un messaggio a tutti i lavoratori per la notifica un evento.

In realtà, ho visto che nessuna riga di codice nella configurazione del processo principale viene eseguita quando si utilizza PM2.

Grazie mille per qualsiasi idea su questo problema!

risposta

6

Con PM2, di solito non è necessario utilizzare questa funzione. In genere, è simile al seguente:

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); 
} 

Con PM2 l'equivalente per quanto sopra è:

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>

si può leggere di più sul tema here

Aggiornamento: puoi provare a distinguere tra master e slave passando la riga di comando argum Ent. Ecco un esempio ecosystem.json:

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

Quindi è possibile effettuare le seguenti operazioni:

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

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

PM2 solo aiuto per fork worker in automatico, ma non è possibile implementare qualcosa come: worker.on ('message', messageHandler) al gestore ricevuto messaggi dal worker :( – thelonglqd

+1

Sarebbe bene che spawn "master" separatamente ? È piuttosto scomodo, ma l'aggiunta di una voce separata per master in ecosystem.json potrebbe funzionare PM2 consente di specificare variabili env per le istanze, che possono aiutare a distinguere tra master e slave. – bublik42

0

PM2 utilizza internamente "cluster" per creare processi figlio, poi si agisce come master, e non lo fa fornire qualsiasi funzione all'esterno. È comunque possibile utilizzare il seguente codice per creare il processo, ma cluster.isMaster è sempre stato falso.

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

A meno che non si avvia in questo modo: pm2 start -x app.jshttps://github.com/Unitech/pm2/issues/363

Il design del PM2 è buona, ma porta la confusione ai principianti. Facciamo tutto il possibile per esaminare i documenti e la ricerca di Google, ma è difficile trovare spiegazioni sul design.

Problemi correlati