2012-12-29 18 views
6

Jestem stosunkowo nowy w witrynie node.js. I mam pytanie z tym związane. O ile mi wiadomo, node.js korzysta z paradygmatu opartego na zdarzeniach, więc odradza tylko jeden wątek i obsługuje wszystko asynchronicznie (moda sterowana zdarzeniami). Pomaga to zużywać mniej zasobów i obsługiwać wiele jednoczesnych połączeń.Obawy związane z plikiem node.js

Mam jedno pytanie związane z tym, ponieważ ma tylko jeden wątek, nawet jeden nieobsługiwany wyjątek może spowodować awarię wszystkiego, co nie jest. W przeciwieństwie do serwera WWW node.js, takiego jak Apache, który może korzystać z wielu procesów do obsługi wielu połączeń, nawet jeśli jeden z procesów zawiesza się, nie ma znaczenia.

Tak, jestem nieco zaniepokojony, czy plik node.js jest na to dobry. Jestem dopiero początkującym. Więc wszelkie spostrzeżenia będą pomocne

+3

http://nodejs.org/api/cluster.html – JohnnyHK

+0

nie widzę dlaczego kwestia ta powinna zostać zamknięta. Każdy bliski wyborca ​​troszczy się o wyjaśnienia? –

+0

+1 dla @JohnnyHK - Moduł klastra zapewnia mały proces "master", który przekazuje pracownikom (zazwyczaj tyle samo procesorów), ile obsługują aplikacje internetowe. Następnie należy napisać mały skrypt, aby rejestrować i ponownie rozstawiać pracowników na nieobsługiwanych błędach.Oto przykładowy skrypt z opakowaniem klastra, który napisałem (przykro mi w CoffeeScript, nie JS): https://gist.github.com/3656510 –

Odpowiedz

3

Użyjmy analogii do wyjaśnienia tego stosunkowo newfangled technologii: gramofon i dziesięciu użytkowników:

PHP wielowątkowych: 10 gramofonów każdy gracz ma jedną rękę + igły, każdy użytkownik ma jeden gramofon. Każdy użytkownik odtwarza kilka nut z własnego odtwarzacza. Nieobsługiwany wyjątek lub syczące dźwięki = odtwarzacz płyt kontynuuje grę, dopóki użytkownik nie podniesie czuwania/procesu zamkniętego. Nikt nie może tego usłyszeć, ponieważ mają swój własny gramofon. No i mają słuchawki.

NodeJS: pojedyncze gwintowane

jeden gracz rekord z ramienia + 10 igieł, po jednym dla każdego użytkownika, a oni wszyscy dzielą że odtwarzacz jeden rekord. Każdy użytkownik uzyskuje dostęp do krótkich notatek, procesu, poza rekordem w tym samym czasie. Jest asynchroniczny, każdy dostaje kawałek muzyki. Nieobsługiwany wyjątek = notatki syczące dla jednego użytkownika, tylko ci, którzy uzyskują dostęp do tych samych notatek, lub ten sam proces, który zgłasza wyjątek, również usłyszą syk. Ale to jest o tym. Wszyscy inni nadal będą słuchać słodkiej muzyki. Nadal mają własne słuchawki.

K. Żadna zła analogia.

Oto rozwiązanie do hipotetycznego problemu W node.js, można dołączyć do słuchacza `uncaughtException” wydarzenie Więc można zabić proces naruszające jeżeli spowodowałoby to, czy może w rzadkich przypadkach. , zdejmij serwer:

2

Używam Cluster, aby obejść problem z pojedynczym gwintem Cluster jest jedną z wbudowanych bibliotek i można ją skonfigurować do uruchamiania jednej lub (n) liczby instancji pracowników. instancja dla każdego rdzenia procesora na serwerze, główny proces monitoruje zdarzenia z procesów roboczych (nie jestem pewien, czy proces jest w 100% prawidłowym terminem) i może przechwytywać zakończenia, rejestrować je, a następnie restartować ponownie on robotnicy. Idealnie byłoby również mieć wiele serwerów sieciowych rozmieszczonych w regionie i system równoważenia obciążenia, który może monitorować twoje serwery sieciowe, wykrywać, kiedy są przeciążone lub nie reagować i podejmować odpowiednie działania, takie jak uruchamianie nowych instancji i zabijanie martwych

Typowy kod używać klaster wygląda następująco (w oparciu o przykład w dokumentacji klastra):

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

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 
    cluster.on('exit', function(worker, code, signal) { 
     console.log('worker ' + worker.process.pid + ' died'); 
     // restart this instance 
     cluster.fork(); 
    }); 
} else { 
    // create an error handler for uncaught exceptions so we can log them 
    process.on('uncaughtException', function(err) { 
     var date = new Date(); 
     var message = date.toString() + ":UNCAUGHT EXCEPTION\n" + err.stack + "\n"; 
     console.log (message); 
     process.exit(1); // we will get restarted by the cluster process 
    }); 
    // Workers can share any TCP connection 
    // In this case its a HTTP server 
    http.createServer(function(req, res) { 
     res.writeHead(200); 
     res.end("hello world\n"); 
    }).listen(8000); 
} 
+0

Świetna odpowiedź i prawdziwe rozwiązanie robocze. Twoje zdrowie! – FredTheWebGuy

Powiązane problemy