2011-09-20 22 views
5

No estoy hablando de la aplicación general de chat, sino específicamente de la implementación de la sala de chat.Discusión: ¿la mejor forma de implementar una sala de chat con node.js/socket.io?

Así que en Node.js/socket.io, pensé en dos enfoques

  1. Crear una matriz para cada sala de chat, mensaje de difusión a todos los usuarios en orden

  2. retransmisiones todos los mensajes a todos los usuarios, en las PC de los clientes, determinan si pertenecen a la sala de chat, de ser así, acepten el mensaje.

La debilidad en 1 es que con el tiempo a medida que escala hasta que inundará la memoria del servidor con objetos de matriz, y utilizando sólo alrededor de 80 MB en mi alojamiento.

La debilidad en 2 es que transmitir a todo el mundo es costoso eventualmente e inundar las máquinas de los clientes no los hará felices.

Estoy seguro de que hay mejores enfoques sobre cómo implementar la sala de chat, por eso les pido que me ayuden. Estoy buscando rendimiento en el lado del servidor primero y luego en el lado del cliente, y debe ser escalable.

+0

Con 80 MB puede crear una gran cantidad de salas de chat. Sus matrices solo necesitan contener los ID del usuario. ¿Hizo alguna prueba de consumo de memoria? – user123444555621

+0

Hicimos un funcionamiento [sala de chat de varias habitaciones] (https://github.com/Raynos/so642). Es de código abierto, no dude en mirar. – Raynos

+0

@ pumbaa80 cierto, pero 80mb se convierte en 20-30mb después de ejecutar muchos otros procesos o tareas cron que pueda necesitar, además, todavía no creo que sea una buena forma de escalar porque la memoria es costosa ... – Derek

Respuesta

1

hice algo similar aquí:

http://davidgranado.com/demos/chat_shuffle/

puede probarlo a cabo mediante la apertura de varias ventanas y hablando consigo mismo, ya que cada caso se considera una persona (es mi primera aplicación nodo).

La forma en que funciona es que cada persona está emparejada con otra persona para una conversación. Efectivamente, todos están en una habitación para dos personas.

Para transmitir los mensajes, inscribo a los usuarios como asociados entre sí y solo lo envío a la charla de un socio. Esta idea se puede expandir fácilmente a cualquier número de personas para asociar las conversaciones. De esa manera, no tienes que hacer una transmisión inútil para todos.

+1

digamos que tiene person1, person2, person3, ¿cómo sabe el servidor enviarles un mensaje/saber que están en una sala de chat sin declarar una matriz para agruparlos en una sala de chat como en mi enfoque 1? – Derek

+0

Creo que mi cerebro no es tan agudo en este momento como pensaba. Es básicamente lo mismo. Por el momento, no uso una matriz per se, ya que son solo dos de ellos. Pero para ampliar la idea, una matriz sería perfecta para una sala de chat para saber a quién transmitir. –

5

Socket.IO 0.7+ introdujo un concepto de habitaciones. Esto es probablemente lo que estás buscando.

io.sockets.on('connection', function (socket) { 
    socket.join('room name'); 

    // broadcast the message to everybody in the room 
    socket.on('chat message', function (data) { 
    socket.broadcast.to('room name').emit('chat message', data); 
    }); 

    socket.on('leave room', function (room) { 
    socket.leave(room); 
    }); 
}); 

Así que no hay necesidad de administrar su propia matriz con los usuarios para determinadas habitaciones, socket.io tiene esta estructura en.

+0

no sabía eso, voy a ver cómo implementan la función socket.join() a continuación. Pero primero, ¿dónde se encuentran las documentaciones de socket.io? – Derek

+0

del readme: https://github.com/learnboost/socket.io https://github.com/learnboost/socket.io-client El sitio de http://socket.io/ Y en el wiki https://github.com/learnboost/socket.io/wiki – 3rdEden

+0

He preparado una [simple demostración de un chat multisala] (https://github.com/jgonera/socket.io-multichat) usando las habitaciones de Socket.IO. Viene con un punto de referencia que le permite verificar qué tan rápido puede ser. –

Cuestiones relacionadas