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