2011-11-22 12 views
5

Escribo una sencilla aplicación de sala de chat en Rails 3.1 para fines de aprendizaje. Para empezar, tengo todos los modelos necesarios (mensajes, usuarios, habitaciones, etc.) y las cosas funcionan muy bien. Los clientes sondean el servidor cada minuto (por ejemplo) y reciben mensajes nuevos si tienen alguno.¿Es posible un largo sondeo con una aplicación Rails utilizando EventMachine?

Me gustaría cambiar el simple sondeo a largo sondeo y no puedo averiguar si esto se puede hacer en la misma aplicación o si tengo que crear otro servidor Push para el sondeo largo.

He leído mucho sobre EventMachine y he cambiado mi aplicación de rieles para usarla, ya que quería usar EventMachine para la mecánica de eventos. Pensé que el canal EventMachine sería útil para esto. Un cliente se conectaría y esperaría un mensaje en la sala de chat y solo recibiría un mensaje cuando se enviara uno a la sala.

Lo que no puedo entender es cómo puedo compartir la instancia de EventMachine :: Channel entre todas las conexiones de mis clientes. ¿Es este enfoque posible o voy en la dirección equivocada?

Si es posible, me gustaría una solución que pueda ejecutarse como una aplicación de rieles única alojada en Heroku.

+0

No soy un experto en máquina de eventos, pero creo que es posible. Y no comparte el canal entre sus clientes, pero tiene uno por cliente y necesita crear algo encima de EM para enviar mensajes entre los diferentes usuarios. – Augusto

+0

Sí, supongo que tengo un canal para cada cliente. ¿Dónde puedo almacenar todas las instancias de canal para que sea accesible desde un controlador que se invoca cuando alguien más envía un mensaje? – Oded

Respuesta

0

Ampliando lo que he mencionado en el comentario, consulte esta publicación blog que explica cómo crear una aplicación de chat basada en texto utilizando EM, y usa AMQP para transmitir los mensajes a los demás usuarios.

Creo que probablemente puedas hacer lo mismo o usar algunas en colas de memoria para compartir mensajes, y esto definitivamente debería funcionar en heroku, ya que no tienes una dependencia a un servicio externo como RabbitMQ. Aquí hay una buena discusión sobre los diferentes marcos de cola: ActiveMQ or RabbitMQ or ZeroMQ or

0

rieles estará transmitiendo añadido en la versión 4. Por ahora, puede transmisión (sondeo de largo) como en this ejemplo, con Sinatra y de Redis/función Sub bar como backend . Deberá agregar otra acción para manejar los mensajes enviados por el usuario y agregarlos a Redis con el comando PUBLICAR. Deberías usar un servidor como Thin o Puma.

1

Sí, claro. Acabo de escribir una demostración usando la máquina de eventos. Mi caso es que el jugador está caminando alrededor de un mapa, y otros jugadores deberían poder verlo. La demo se ve así:

  1. Un cliente establece una conexión, que informa sobre su propia coordenadas (aleatoriamente)

  2. Hay una gran variedad preservar todas las coordenadas para cada cliente

  3. Cuando un cliente se mueve, envía sus nuevas coordenadas al servidor. Luego, el servidor descubre personas cercanas a él (de la matriz) y envía la nueva coordenada a esos clientes.

Lo probé con casi 5000 clientes, y cada segundo 20-30 jugadores se mueve en su posición. Y el proceso del servidor solo requiere menos de 100M de memoria & 50% -60% de uso de la CPU (en un solo núcleo).

En tu caso, creo que probablemente deberías probar a faye también. Se basa en la máquina de eventos y una solución adecuada para cosas como la sala de chat.

Cuestiones relacionadas