2012-03-22 15 views
28

Qualcuno può spiegare in dettaglio come funziona il modulo core cluster in Node.js?Come funziona il modulo cluster in Node.js?

Come gli operatori sono in grado di ascoltare una singola porta?

Per quanto ne so che il processo master fa l'ascolto, ma come può sapere quali porte ascoltare poiché i lavoratori vengono avviati dopo il processo master? In qualche modo comunicano di nuovo al master utilizzando il canale di comunicazione child_process.fork? E se sì, come la connessione in entrata alla porta viene passata dal master al lavoratore?

Inoltre mi chiedo quale logica viene utilizzata per determinare a quale operatore viene passata una connessione in ingresso?

+0

Ho una domanda su come il modulo cluster instrada le richieste TCP. Ad esempio, ho il codice pubsub Redis e tutti i dipendenti del cluster npm ricevono i messaggi; anche mentre le richieste HTTP vengono indirizzate a un solo worker. C'è un modo per configurare il cluster in modo che solo un lavoratore riceva richieste di socket e non tutti i lavoratori? L'ho fatto io stesso solo avendo il master in attesa del listener di pubsub e poi delegando manualmente a ciascuno dei lavoratori. Ma l'intero punto del cluster è quello di fare questo per te immediatamente ... –

risposta

12

So che questa è una vecchia questione, ma questo è ora spiegato in nodejs.org here:

I processi di lavoro sono generati utilizzando il child_process .fork method, in modo che possano comunicare con il genitore tramite IPC e passare le maniglie del server avanti e indietro.

Quando si chiama server.listen (...) in un worker, serializza gli argomenti e passa la richiesta al processo principale. Se il processo master ha già un server di ascolto che corrisponde ai requisiti del worker, passa l'handle al worker. Se non dispone già di un server di ascolto che soddisfi tale requisito, lo ne crea uno e passa l'handle al lavoratore.

Questo provoca comportamenti potenzialmente sorprendente in tre casi limite:

server.listen ({FD: 7}) - Poiché il messaggio viene passato al master, descrittore di file 7 nel genitore sarà ascoltato su e la maniglia passata al worker, invece di ascoltare l'idea dell'operaio di a cosa si riferisce il descrittore di file numero 7.

server.listen (maniglia) - ascolto sulle maniglie esplicitamente farà sì che il lavoratore utilizzare la maniglia in dotazione, piuttosto che parlare con il processo di master. Se il lavoratore ha già l'handle, allora si presume che tu sappia cosa stai facendo.

server

.listen (0) - Normalmente, questo causerà l'ascolto dei server su una porta casuale . Tuttavia, in un cluster, ogni lavoratore riceverà la stessa porta "casuale" ogni volta che ascolta (0). In sostanza, la porta è casuale la prima volta, ma prevedibile in seguito. Se si desidera ascoltare su una porta univoca, generare un numero di porta in base all'ID lavoratore del cluster.

Quando più processi vengono tutti accettati() sulla stessa risorsa sottostante , il bilanciamento del carico del sistema operativo tra di loro molto efficacemente . Non esiste alcuna logica di routing in Node.js o nel tuo programma, e nessuno stato condiviso tra i lavoratori. Pertanto, è importante che il progetti il ​​programma in modo tale che non si basi troppo sugli oggetti dati in memoria per cose come sessioni e login.

Poiché i lavoratori sono tutti processi separati, possono essere eliminati o ri-spawn a seconda delle esigenze del programma, senza intaccare altri lavoratori . Finché ci sono alcuni lavoratori ancora vivi, il server continuerà ad accettare connessioni. Il nodo non automaticamente gestisce il numero di lavoratori per te. È la tua responsabilità di gestire il pool di lavoro per le esigenze della tua applicazione.

8

NodeJS utilizza una decisione round-robin per eseguire il bilanciamento del carico tra i processi figlio. Fornirà le connessioni in entrata a un processo vuoto, basato sull'algoritmo RR.

I figli e il genitore non condividono effettivamente nulla, l'intero script viene eseguito dall'inizio alla fine, questa è la differenza principale tra la normale forcella C. Il bambino forfettario di C tradizionale continuava a eseguire dall'istruzione in cui era rimasto, non all'inizio come NodeJS. Quindi, se vuoi condividere qualcosa, devi connetterti ad una cache come MemCache o Redis.

Quindi il codice seguente produce 6 6 6 (nessun mezzo cattivo) sulla console.

var cluster = require("cluster"); 
var a = 5; 
a++; 
console.log(a); 
if (cluster.isMaster){ 
    worker = cluster.fork(); 
    worker = cluster.fork(); 
} 
+1

Grazie per le informazioni sul round robin, ma penso che tu abbia frainteso la mia domanda sul passaggio della connessione. Sto parlando delle connessioni TCP che arrivano alla porta condivisa, non di come comunicare tra i lavoratori. – Epeli

+0

@Epeli Questa discussione può essere utile alla tua domanda: https://groups.google.com/forum/#!topic/nodejs/svIXu5wUXCI/discussion – Mustafa

+2

Sto trovando che su Windows non obbedisce a Round Robin. Posso generare 10 lavoratori e se la mia macchina è abbastanza veloce getterà tutte le connessioni in entrata al primo operatore. Eventuali suggerimenti? –

4

Ecco un blog post che spiega questo

+3

Si noti che le risposte di solo collegamento sono scoraggiate, quindi le risposte dovrebbero essere il punto finale di una ricerca di una soluzione (rispetto a un'altra sosta di riferimenti, che tendono a diventare obsoleti col tempo). Si prega di considerare l'aggiunta di una sinossi autonoma qui, mantenendo il collegamento come riferimento. – kleopatra

0

Come aggiornamento della risposta di @ OpenUserX03, nodejs non ha più utilizzato il bilanciamento del carico del sistema ma ne utilizza uno integrato. da this post:

per risolvere questo nodo v0.12 ottenuto una nuova implementazione utilizzando un algoritmo round robin per distribuire il carico tra i lavoratori in un modo migliore. Questo è l'approccio predefinito utilizzato dal nodo da allora incluso Nodo v6.0.0

Problemi correlati