2011-11-22 10 views
5

Sto scrivendo una semplice applicazione di chat room in Rails 3.1 - per scopi di apprendimento. Per i principianti ho tutti i modelli necessari (messaggi, utenti, stanze, ecc.) E le cose funzionano alla grande. I client eseguono il polling del server ogni minuto (ad esempio) e ottengono nuovi messaggi se ne hanno.Il polling lungo è possibile con un'applicazione Rails utilizzando EventMachine?

Vorrei cambiare il polling semplice a polling lungo e non riesco a capire se questo può essere fatto nella stessa app o devo creare un altro server Push per il polling lungo.

Ho letto molto su EventMachine e ho modificato l'app per i miei binari come se volessi utilizzare EventMachine per i meccanismi guidati dagli eventi. Pensavo che il canale EventMachine sarebbe stato utile per questo. Un client si connette e attende un messaggio nella chat room e riceverà un messaggio solo quando uno è stato inviato nella stanza.

Quello che non riesco a capire è come posso condividere l'istanza di EventMachine :: Channel tra tutte le mie connessioni client. Questo approccio è possibile o sto andando nel modo sbagliato?

Se possibile, vorrei una soluzione che può essere eseguita come applicazione di un singolo binario ospitata su Heroku.

+0

Non sono un esperto di macchine per eventi, ma penso che sia possibile. E tu non condividi il canale tra i tuoi clienti, ma ne hai uno per cliente e devi creare qualcosa su EM per inviare messaggi tra i diversi utenti. – Augusto

+0

Sì, dire che ho un canale per ogni cliente. Dove posso memorizzare tutte le istanze di canale in modo che siano accessibili da un controller richiamato quando qualcun altro invia un messaggio? – Oded

risposta

0

Espandere ciò che ho menzionato nel commento, controllare questo post blog che spiega come creare un'app di chat basata su testo utilizzando EM e utilizza AMQP per trasmettere i messaggi agli altri utenti.

Penso che probabilmente si possa fare lo stesso o utilizzare alcune code di memoria per condividere messaggi, e questo sicuramente dovrebbe funzionare su heroku, in quanto non si ha una dipendenza da un servizio esterno come RabbitMQ. Ecco una buona discussione su diversi quadri di coda: ActiveMQ or RabbitMQ or ZeroMQ or

0

Rails avranno lo streaming aggiunta nella versione 4. Per il momento, è possibile lo streaming (polling lungo) come in this esempio con Sinatra e Redis di pub funzione/Sub come backend . Dovrai aggiungere un'altra azione per gestire i messaggi inviati dall'utente, aggiungendoli a Redis con il comando PUBLISH. Dovresti usare un server eventato come Thin o Puma.

1

Sì, certo. Ho appena scritto una demo utilizzando la macchina degli eventi. Il mio caso è quel giocatore che cammina su una mappa, e gli altri giocatori dovrebbero essere in grado di vederlo. La demo sembra che:

  1. Un client stabilisce una connessione, riportando la propria coordinate (casuale)

  2. C'è un array conservando tutte le coordinate di ciascun cliente

  3. Quando un client si sposta, invia la sua nuova coordinata al server. Quindi il server trova le persone vicine a lui (dall'array) e spinge le nuove coordinate a quei client.

L'ho testato con quasi 5000 client e ogni secondo 20-30 giocatori si sposta. E il processo del server richiede solo meno di 100 milioni di memoria & utilizzo della cpu 50% -60% (su un singolo core).

Nel tuo caso, penso che probabilmente dovresti provare anche la fata. Si basa sulla macchina degli eventi e una soluzione appropriata per cose come la chat room.