2015-02-19 11 views
7

Badam opcje działania węzła w środowisku wielordzeniowym.NodeJS na wielu procesorach (PM2, Cluster, Recluster, Naught)

Próbuję ustalić najlepsze podejście i do tej pory widziałem te opcje

  • korzystać z wbudowanych w bibliotece klastra rozpędzać się prace i reagowania na sygnały
  • Zastosowanie PM ale PM2 - Jestem na liście beta.
  • Naught
  • Recluster

Czy istnieją inne alternatywy? Co ludzie używają w produkcji?

Odpowiedz

5

Używam domyślnej biblioteki klastrów i działa ona bardzo dobrze. Miałem ponad 10 000 współbieżności (wiele klastrów na wielu serwerach) i działa bardzo dobrze.

Zaleca się używanie klastrów z domeną do obsługi błędów.

Zostało to podniesione prosto z http://nodejs.org/api/domain.html Mam kilka zmian, w jaki sposób tworzy nowe klastry dla każdego rdzenia maszyny. i pozbyłem się if/else i dodałem express.

var cluster = require('cluster'), 
    http = require('http'), 
    PORT = process.env.PORT || 1337, 
    os = require('os'), 
    server; 

function forkClusters() { 
    var cpuCount = os.cpus().length; 
    // Create a worker for each CPU 
    for (var i = 0; i < cpuCount ; i += 1) { 
     cluster.fork(); 
    } 
} 

// Master Process 
if (cluster.isMaster) { 

    // You can also of course get a bit fancier about logging, and 
    // implement whatever custom logic you need to prevent DoS 
    // attacks and other bad behavior. 
    // 
    // See the options in the cluster documentation. 
    // 
    // The important thing is that the master does very little, 
    // increasing our resilience to unexpected errors. 

    forkClusters() 

    cluster.on('disconnect', function(worker) { 
     console.error('disconnect!'); 
     cluster.fork(); 
    }); 

} 
function handleError (d) { 
    d.on('error', function(er) { 
     console.error('error', er.stack); 

     // Note: we're in dangerous territory! 
     // By definition, something unexpected occurred, 
     // which we probably didn't want. 
     // Anything can happen now!Be very careful! 

     try { 
      // make sure we close down within 30 seconds 
      var killtimer = setTimeout(function() { 
       process.exit(1); 
      }, 30000); 
      // But don't keep the process open just for that! 
      killtimer.unref(); 

      // stop taking new requests. 
      server.close(); 

      // Let the master know we're dead.This will trigger a 
      // 'disconnect' in the cluster master, and then it will fork 
      // a new worker. 
      cluster.worker.disconnect(); 
     } catch (er2) { 
      // oh well, not much we can do at this point. 
      console.error('Error sending 500!', er2.stack); 
     } 
    }); 
} 
// child Process 
if (cluster.isWorker) { 
    // the worker 
    // 
    // This is where we put our bugs! 

    var domain = require('domain'); 
    var express = require('express'); 
    var app = express(); 
    app.set('port', PORT); 

    // See the cluster documentation for more details about using 
    // worker processes to serve requests.How it works, caveats, etc. 

    var d = domain.create(); 
    handleError(d); 

    // Now run the handler function in the domain. 
    // 
    // put all code here. any code included outside of domain.run will not handle errors on the domain level, but will crash the app. 
    // 

    d.run(function() { 
     // this is where we start our server 
     server = http.createServer(app).listen(app.get('port'), function() { 
      console.log('Cluster %s listening on port %s', cluster.worker.id, app.get('port')); 
     }); 
    }); 
} 
+0

Będzie to automatycznie tarło pracownika na jeden rdzeń? Wygląda na to, że migracja tego samego pomysłu do ekspresji byłaby prosta. –

+0

Tak. to automatycznie spawnuje nowy klaster na rdzeń. Następnie uruchamiasz swojego ekspresowego słuchacza w każdym innym stwierdzeniu. –

+0

Dodam kod do rozwidlenia na liczbę cpu –

0

Używamy Supervisor zarządzać naszymi node.js procesowego, aby uruchomić je na bagażniku, a także pełnić funkcję watchdog w przypadek awarii procesu wywołującego tę funkcję.

Używamy Nginx jako reverse-proxy, aby załadować ruch równowaga pomiędzy procesem, że słuchać różnych portach

ten sposób każdy proces jest odizolowany od innych.

na przykład: Nginx nasłuchuje na porcie 80 i przekazuje ruch do portów 8000-8003

+0

Jak radzisz sobie z pełnym gracją wyłączaniem? –

+0

Zmieniamy kontrolę stanu, aby przywrócić 404, gdy kończymy obsługę pozostałych żądań, a następnie ELB przestaje wysyłać ruch do tego serwera, a wszystkie poprzednie żądania są obsługiwane przed zamknięciem serwera. –

+0

1) Skąd wiadomo, kiedy można bezpiecznie zamknąć system? 2) Jak radzisz sobie z niezatłoczonymi wyjątkami? –

0

używałem PM2 na dłuższą chwilę, ale ich ceny są drogie jak na moje potrzeby, jak mam mojego własnego środowiska analityki i nie potrzebuję wsparcia, więc postanowiłem eksperymentować z alternatywami. Na moim przypadku, po prostu zawsze wykonane podstęp, bardzo prosty w rzeczywistości:

forever -m 5 app.js 

Innym użytecznym przykładem jest

forever start app.js -p 8080 
Powiązane problemy