2015-12-24 4 views
5

Ich habe ein Problem mit PM2 in NodeJS. Ohne PM2, wir haben einige Codezeilen immer wie unten Master-ProzessWie können wir Master-Prozess konfigurieren, wenn PM2 verwenden

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

genau zu konfigurieren, ich will Meister von einem Arbeiter-Nachricht senden, dann wird Master eine Nachricht an alle Arbeiter für die Benachrichtigung zurückschicken ein Ereignis.

Eigentlich sah ich, dass keine Codezeilen in Master-Prozesskonfiguration ausgeführt wird, wenn PM2 verwendet.

Vielen Dank für eine Idee zu diesem Thema!

Antwort

6

Mit PM2 müssen Sie diese Konstruktion normalerweise nicht verwenden. Typischerweise sieht es wie folgt aus:

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

Mit PM2 das Äquivalent für das oben ist:

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>

können Sie mehr zum Thema lesen Sie here

Update: Sie können versuchen, zwischen Master und Slave zu unterscheiden, indem Sie Befehlszeilenargument übergeben . Hier ist ein Beispiel ecosystem.json:

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

Dann können Sie wie folgt vorgehen:

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

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

PM2 hilft nur, Arbeiter automatisch zu forken, aber Sie können etwas wie nicht implementieren: worker.on ('nachricht', messageHandler) zu handler empfangene nachrichten von worker :( – thelonglqd

+1

Wäre es in Ordnung für Sie, "Master" separat zu spawnen ? Es ist ziemlich umständlich, aber das Hinzufügen eines separaten Eintrags für Master in ecosystem.json würde funktionieren PM2 ermöglicht es, env-Variablen für Instanzen anzugeben, die Ihnen helfen können, zwischen Master und Slave zu unterscheiden. – bublik42

0

PM2 intern verwendet „Cluster“ Kindprozesse zu erstellen, dann wirkt sich als Meister, und nicht stellen Sie irgendeine Funktion nach außen zur Verfügung. Sie können den folgenden Code weiterhin zum Erstellen des Prozesses verwenden, aber cluster.isMaster war immer falsch.

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

Es sei denn, Sie wie folgt beginnen: pm2 start -x app.jshttps://github.com/Unitech/pm2/issues/363

Das Design von PM2 ist gut, aber es bringt Verwirrung Anfänger. Wir tun alles, um Dokumente und die Google-Suche zu betrachten, aber es ist schwer, eine Erklärung für das Design zu finden.

Verwandte Themen