2012-03-22 12 views
28

Czy ktoś może wyjaśnić szczegółowo, w jaki sposób moduł rdzeniowy cluster działa w Node.js?Jak działa moduł klastra w Node.js?

W jaki sposób pracownicy mogą słuchać jednego portu?

O ile wiem, że proces główny wykonuje nasłuchiwanie, ale w jaki sposób może on wiedzieć, które porty słuchać, od kiedy pracownicy są uruchamiani po procesie nadrzędnym? Czy oni w jakiś sposób komunikują to z powrotem do mistrza za pomocą kanału komunikacyjnego child_process.fork? A jeśli tak, to w jaki sposób połączenie przychodzące do portu przekazywane jest od kapitana do pracownika?

Zastanawiam się także, jaka logika jest używana do określenia, do którego pracownika przychodzi połączenie przychodzące?

+0

Mam pytanie dotyczące sposobu, w jaki moduł klastra trasuje żądania TCP. Na przykład mam kod pubsub Redis i każdy pracownik w klastrze npm otrzymuje wiadomości; nawet gdy żądania HTTP są kierowane tylko do jednego pracownika. Czy istnieje sposób konfigurowania klastra, aby tylko jeden pracownik odbierał żądania gniazd, a nie wszyscy pracownicy? Zrobiłem to sam, tylko mając master hold słuchacza pubsub, a następnie delegując ręcznie do każdego z pracowników. Ale cały punkt klastra polega na tym, żeby zrobić to dla ciebie po wyjęciu z pudełka ... –

Odpowiedz

12

wiem, że to jest stare pytanie, ale teraz jest to wyjaśnione w nodejs.org here:

Procesy robocze są zrodził pomocą child_process .fork method, , dzięki czemu mogą komunikować się z rodzicem za pośrednictwem IPC i przekazywać serwer obsługuje iz powrotem.

Po wywołaniu pliku server.listen (...) w module roboczym następuje przekształcenie do postaci szeregowej argumentów i przekazanie żądania do procesu głównego. Jeśli procesor master ma już serwer nasłuchujący zgodny z wymaganiami pracownika , przekazuje uchwyt do procesu roboczego. Jeśli serwer nie ma już serwera nasłuchującego spełniającego to wymaganie, to utworzy je i przekaże uchwyt pracownikowi.

Powoduje to potencjalnie zaskakujące działanie w trzech przypadkach krawędzi:

server.listen ({7} fd) - Ponieważ komunikat jest przekazywany do opanowania, plik opisu 7 w macierzystym będzie odsłuchana , a uchwyt przekazany pracownikowi, zamiast wsłuchiwania się w pomysł pracownika o numerze , do którego odnosi się deskryptor pliku numeru 7.

server.listen (uchwyt) - Słuchanie na uchwytach wyraźnie spowoduje, że pracownik użyć dołączonego uchwytu, zamiast rozmawiać z głównego procesu. Jeśli robotnik ma już uchwyt, to zakłada się, że wiesz, co robisz, . Serwer

.listen (0) - Zazwyczaj spowoduje to, że serwery nasłuchują na losowym porcie . Jednak w klastrze każdy pracownik otrzyma ten sam port "losowy" za każdym razem, gdy będzie nasłuchiwał (0). W zasadzie port jest losowy po raz pierwszy, ale przewidywalny później. Jeśli chcesz słuchać na unikalnym porcie, wygeneruj numer portu na podstawie identyfikatora pracownika klastra .

Gdy wiele procesów jest akceptowanych() na tym samym bazowym źródle , system operacyjny ładuje - salda w nich bardzo skutecznie - . Brak logiki routingu w Node.js lub w twoim programie, i brak współdzielonego stanu między pracownikami. Dlatego ważne jest, aby zaprojektować program tak, aby nie opierał się zbytnio na obiektach danych w pamięci dla obiektów takich jak sesje i logowanie.

Ponieważ pracownicy są oddzielnymi procesami, mogą zostać zabici lub ponownie odrodzone, w zależności od potrzeb programu, bez wpływu na innych pracowników . Tak długo, jak niektórzy pracownicy wciąż żyją, serwer będzie nadal akceptował połączenia. Węzeł nie powoduje jednak automatycznego zarządzania liczbą pracowników. Obowiązkiem użytkownika jest zarządzanie pulą pracowników dla potrzeb aplikacji.

8

NodeJS używa decyzji round-robin do równoważenia obciążenia między procesami podrzędnymi. Da to przychodzące połączenia do pustego procesu, w oparciu o algorytm RR.

Dzieci i rodzic w rzeczywistości niczego nie udostępniają, cały skrypt jest wykonywany od początku do końca, to jest główna różnica między normalnym widelcem C. Tradycyjne dziecko w kształcie C kontynuuje wykonywanie instrukcji od miejsca, w którym zostało, a nie od początku, jak NodeJS. Więc jeśli chcesz coś udostępnić, musisz połączyć się z pamięcią podręczną, taką jak MemCache lub Redis.

Tak więc poniższy kod generuje 6 6 6 (brak złych metod) na konsoli.

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

Dzięki za informacje o rundach, ale myślę, że źle zrozumiałeś moje pytanie o połączenie. Mówię o połączeniach TCP przychodzących do wspólnego portu, a nie o komunikacji między pracownikami. – Epeli

+0

@Epeli Ta dyskusja może być pomocna w uzyskaniu odpowiedzi na pytanie: https://groups.google.com/forum/#!topic/nodejs/svIXu5wUXCI/discussion – Mustafa

+2

Zauważyłem, że w systemie Windows nie przestrzega ona programu Round Robin. Mogę odrodzić 10 pracowników i jeśli moja maszyna będzie wystarczająco szybka, wyrzuci wszystkie przychodzące połączenia do pierwszego pracownika. Jakieś sugestie? –

4

Oto blog post że wyjaśnia to

+3

Należy pamiętać, że odradza się udzielanie jedynie linków, odpowiedzi SO powinny być punktem końcowym wyszukiwania rozwiązania (w przeciwieństwie do kolejnego zatrzymania referencji, które mają tendencję do starzenia się z biegiem czasu). Proszę rozważyć dodanie samodzielnego streszczenia tutaj, zachowując odnośnik jako odniesienie. – kleopatra

0

Jako odpowiedź na odpowiedź @ OpenUserX03, firma nodejs nie używa już systemu sald obciążenia, ale używa wbudowanego. od this post:

Aby naprawić v0.12 węzeł ma nową implementację używając algorytmu round-robin, aby rozłożyć obciążenie pomiędzy pracownikami w lepszy sposób. Jest to podejście domyślne Od czasu użycia węzła, w tym węzła v6.0.0

Powiązane problemy