threads nodejs node cluster node.js distributed-computing multiserver

nodejs - Node.js Multi Server Clustering



node js web worker (2)

Estoy trabajando en un proyecto con Node.js que involucra un servidor (por simplicidad, imaginemos este servidor como un servidor de chat que tiene que reenviar mensajes de ciertos clientes a otros clientes). Necesito por razones de QoS que este servidor esté siempre accesible, por lo que pensé usar el clúster para dividir la carga de equilibrio entre diferentes servidores (diferentes máquinas físicas) y para asegurarme de que si un servidor falla, otro estará listo para atender las solicitudes. .

Mi pregunta es: ¿es posible este tipo de enfoque distribuido en Node.js?

Ya leí sobre el módulo "clúster", pero, por lo que entendí, parece escalar solo en multiprocesadores en la misma máquina.


Mi recomendación es que aproveche los grupos independientes para compartir el estado. En otras palabras, tenga un clúster de API donde los servidores no se comuniquen entre sí, sino que compartan una instancia / clúster de Redis común y compartan un clúster de MongoDB. Esto le permite compartir sesiones y variables, y puede aprovechar las capacidades de publicación / sub de Redis para evitar la necesidad de chismear dentro de su grupo de API.

Específicamente para Chat, si usa Redis con Socket.IO como su cliente, entonces cada vez que transmita a un lobby, usará redis detrás de la escena para transmitir ese mensaje a ese lobby, a pesar de que los miembros del lobby existen en varios servidores. Además, esto crea otro nivel de tolerancia a fallos, ya que cualquier servidor puede administrar las reconexiones de socket, y socket.io se volverá a conectar automáticamente al clúster de API si se interrumpe la conexión, todo esto mientras se mantiene el estado a través de Redis.


Sí, es posible.

No es una propiedad de NodeJS, sino la arquitectura que diseña para su aplicación, que determinará si puede hacerlo o no.

Su principal problema siempre será compartir el estado en sus instancias, así que digamos que tiene 4 servidores de chat ABCD, y que tiene un LoadBalancer L que distribuye las conexiones entre los 4 servidores, luego, cuando A se apaga, y vuelve a conectar todas las conexiones de A a instancias restantes, ¿cómo se asegura de que el estado de la sala de chat sea el mismo en BC y D?

Una forma es hacer que el código de la aplicación sea completamente sin estado, y enviar todos los datos a una base de datos distribuida en la memoria, como mongoDb o Redis. Desea que la base de datos se distribuya en caso de que una de las instancias de la base de datos se caiga.

Ahora tu último problema es el LoadBalancer. Si eso se cae, todo tu sistema está caído.

Así que para hacer una larga historia corta; Sí, puedes hacerlo, pero debes tomar algunas decisiones difíciles sobre dónde van a estar tus puntos potenciales de falla. Si no desea un único punto de falla, necesitará una configuración compleja y costosa.