Pregunta

Tengo una aplicación de chat de NodeJ donde múltiples clientes se conectan a una sala de chat común con Socketio. Quiero escalar esto a múltiples procesos de nodo, posiblemente en diferentes máquinas. Sin embargo, no se garantizará que los clientes que se conectan a la misma sala alcanzarán el mismo proceso de nodo. Por ejemplo, el usuario 1 presionará el proceso del nodo A y el usuario 2 presionarán el proceso del nodo B. Está en la misma habitación, por lo que si el usuario 1 envía un mensaje, el usuario 2 debería obtenerlo. ¿Cuál es la mejor manera de hacer que esto suceda ya que sus conexiones son administradas por diferentes procesos?

Pensé en que los procesos de nodo se conecten a Redis. Esto al menos resuelve el problema que procesa a saber Hay otro usuario, el usuario 2, en la habitación, pero aún no puede enviar al usuario 2 porque el proceso B controla esa conexión. ¿Hay alguna forma de registrar una devolución de llamada de "valor cambiado" para Redis?

Estoy en un entorno de servidor donde no puedo controlar ninguno de los enrutamiento o equilibrio de carga.

¿Fue útil?

Solución

Ambos procesos Node.js se pueden suscribirse a algún canal a través de Redis pub/submarino y escuche mensajes que pasan a este canal. Por ejemplo, cuando el usuario 1 se conecta para procesar A en la primera máquina, puede almacenar en la información de Redis sobre este usuario junto con la información qué proceso en qué máquina lo administra. Luego, cuando el usuario 2, que está conectado al proceso B en la segunda máquina, envía un mensaje al usuario 1, puede publicarlo en este canal y verificar qué proceso en qué máquina es responsable de administrar la comunicación con el usuario 1 y responder en consecuencia.

Otros consejos

He hecho (hice) algunas investigaciones sobre esto. Debajo de mis hallazgos:

Como Yojimbo87 dijo que primero usas Redis Pub/Sub (está muy optimizado).

http://comments.gmane.org/gmane.comp.lang.javascript.nodejs/22348

Tim Caswell escribió:

Ha sido mi experiencia que el cuello de botella es la serialización y des-serialización de los datos, no el canal real. Estoy bastante seguro de que puedes usar tuberías con nombre, pero no estoy seguro de cuál es la API. Msgpack parece un buen formato para el intercambio de datos. Existen algunas bibliotecas que implementan marcos MSGPACK o IPC además.

Pero cuando la serialización / deserialización se convierte en su cuello de botella, intentaba usar https://github.com/pgriess/node-msgpack. También me gustaría probar esto, porque creo que cuanto antes tengas esto, ¿mejor?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top