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.
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 ... –