Węzeł.js Multi Server Clustering

Pracuję nad projektem z Node.js, który obejmuje serwer (dla uproszczenia wyobraźmy sobie ten serwer jako serwer czatu, który musi przesyłać wiadomości od niektórych klientów do innych klientów). Muszę z powodów QoS, że ten serwer jest zawsze osiągalny, więc pomyślałem, aby użyć klastrowania, aby podzielić obciążenie balansu między różnymi serwerami (różne maszyny fizyczne) i mieć pewność, że jeśli serwer pójdzie w dół, inny będzie gotowy do obsługi prośby.

Moje pytanie brzmi: czy takie rozproszone podejście jest możliwe w Node.js?

Czytałem już o module "cluster", ale z tego, co zrozumiałem, wydaje się, że skaluje się tylko na wieloprocesorach na tej samej maszynie.

Author: Jason Aller, 2013-03-19

2 answers

Tak, to możliwe.

Nie jest to właściwość NodeJS, ale raczej Architektura, którą zaprojektujesz dla swojej aplikacji, która określi, czy możesz to zrobić, czy nie.

Twoim głównym problemem zawsze będzie dzielenie się stanem między instancjami, więc powiedzmy, że masz 4 serwery czatu A B C D, i masz LoadBalancer L, który rozprzestrzenia połączenia między 4 serwerami, a kiedy a spada, i ponownie podłączysz wszystkie połączenia A do pozostałych instancji, jak zapewnić, że the stan czatu jest taki sam na B C i D?

Jednym ze sposobów jest to, aby kod aplikacji był całkowicie bezpaństwowy i wypchnąć wszystkie dane do rozproszonej w pamięci bazy danych, takiej jak mongoDb lub Redis. Chcesz, aby baza danych była dystrybuowana na wypadek, gdyby jedna z instancji bazy danych upadła.

Teraz ostatnim problemem jest LoadBalancer. Jeśli to się nie uda, cały Twój system padnie.

Więc, aby długa historia krótko; tak można to zrobić, ale trzeba podjąć kilka trudnych decyzji na gdzie będą twoje potencjalne punkty porażki. Jeśli nie chcesz jednego punktu awarii, będziesz potrzebować złożonej i kosztownej konfiguracji.

 30
Author: ExxKA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-19 14:45:06

Moje zalecenia to wykorzystanie niezależnych klastrów do współdzielenia Państwa. Innymi słowy, mają klaster API, w którym serwery nie rozmawiają ze sobą, ale zamiast tego mają wspólną instancję/klaster Redis i wspólny klaster MongoDB. Pozwala to na udostępnianie sesji, zmiennych i można wykorzystać możliwości pub/sub Redis, aby uniknąć konieczności plotkowania w klastrze API.

Dla czatu, jeśli używasz Redis z Socket.IO jako twój Klient, wtedy gdy jeśli transmitujesz do lobby, użyje redis za kulisami do transmisji tej wiadomości do lobby, mimo że członkowie lobby istnieją na wielu serwerach. Dodatkowo tworzy to kolejny poziom tolerancji błędów, ponieważ każdy serwer może zarządzać ponownymi połączeniami gniazd i socket.io automatycznie połączy się ponownie z klastrem API, jeśli jego połączenie zostanie przerwane, przy zachowaniu stanu przez Redis.

 5
Author: user2552012,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-05 00:48:44