Node.js cluster multiservidor: cómo compartir objetos en varios nodos cluster

Quiero crear un clúster del servidor node.js para soportar alta concurrencia, para una aplicación de salas de chat. Necesito poder compartir información entre todos los nodos. Estoy tratando de descubrir cuál sería la mejor manera de mantener todos los servidores sincronizados. Quiero la mayor flexibilidad posible en el objeto compartido, ya que planeo agregar más funciones en el futuro.

Hasta ahora, tengo 2 soluciones en mente:

  1. Suscribirse a la clave NoSQL (por ejemplo, redis publish-subscribe )
  2. Los nodos se actualizan entre sí utilizando sockets .

¿Cual es mejor? ¿Alguna otra idea?

Redis es agradable porque es independiente de su aplicación de nodo y es bastante fácil de escalar. También puede usarlo para muchas cosas fuera del pub / sub, como compartir estructuras de datos básicas (hashes, conjuntos ordenados, listas, cadenas) entre los servidores de nodo para ayudar a mantenerlos sincronizados de esta manera también. Teóricamente, podría guardar todos los chats en una sala determinada como un conjunto ordenado donde su clave es una representación json de algún objeto de chat (algo como {'user':'some_user','msg':'some_msg'} y su puntaje es la marca de tiempo, por lo que es muy fácil extraer conversaciones por tiempo). Redis es extremadamente rápido, y sus estructuras de datos están altamente optimizadas, por lo que un solo servidor puede manejar muchos, muchos usuarios.

Tenemos una configuración similar en producción con un servidor Redis que maneja 1 millón de usuarios (alrededor de 10k inserciones de hits y 20k lecturas de un conjunto ordenado por minuto), y el uso de la CPU rara vez supera el 5% en una caja sin CPU.