2013-08-05 16 views
7

Sto provando a utilizzare il componente Live Streaming di Rails 4. Funziona tutto tranne che sembra che il flusso rimanga aperto e blocchi la nuova richiesta.Rails 4, Live Streaming, rimane aperto, bloccando le richieste

Come posso garantire che la connessione si chiuda correttamente quando si chiude o si fa clic su un nuovo collegamento all'interno dell'applicazione?

Questo è il mio controller eventi dal vivo.

def events 
    response.headers["Content-Type"] = "text/event-stream" 
    redis = Redis.new 
    redis.psubscribe("participants.*") do |on| 
     on.pmessage do |pattern, event, data| 
     response.stream.write("event: #{event}\n") 
     response.stream.write("data: #{data}\n\n") 
     end 
    end 
    rescue IOError 
    ensure 
    redis.quit 
    response.stream.close 
    end 

conf Database

production: 
    adapter: postgresql 
    encoding: unicode 
    database: ************ 
    pool: 1000 
    username: ************ 
    password: ************ 
    timeout: 5000 

sto usando puma come webserver standalone (non ho i file statici pesanti che hanno bisogno di essere servita da nginx) su Ubuntu 10.04 con PostgreSQL 9.2.x.

+0

Sei mai stato in grado di risolvere questo problema? La risposta di Dan è un buon riassunto di ciò che sta succedendo, ma non risponde alla domanda (presumo anche per te dato che non l'hai accettato). –

+1

@Teeg Come hai scritto, è un buon riassunto ma non ha risolto la mia domanda. Alla fine ho usato Faye, il che è triste perché volevo che funzionasse correttamente. – Philip

+1

Questo è troppo male. Ho pubblicato una [domanda simile] (http://stackoverflow.com/q/18970458/877472) che contiene una soluzione sciocca. Ti farò sapere se riuscirò mai a capirlo. –

risposta

2

Puma non dovrebbe bloccare e dovrebbe consentire più thread per consentire più richieste.

Per guidarti attraverso ciò che sta accadendo nel tuo codice. Attualmente stai utilizzando due thread in questo codice per richiesta. Il thread su cui è arrivata la richiesta e un thread in background utilizzato per mantenere aperta la connessione.

Le connessioni si chiuderanno correttamente a causa del blocco di sicurezza alla fine del metodo di azione.

def events 
    response.headers["Content-Type"] = "text/event-stream" 
    redis = Redis.new 
    # blocks the current thread 
    redis.psubscribe("participants.*") do |on| 
    on.pmessage do |pattern, event, data| 
     response.stream.write("event: #{event}\n") 
     response.stream.write("data: #{data}\n\n") 
    end 
    end 
    # stream is on a background thread and will remain open until 
    # redis.psubscrie exits. (IO Error, etc) 
rescue IOError 
ensure 
    redis.quit 
    response.stream.close 
end 

Si potrebbe anche studiare un altro server chiamato arcobaleni (http://rainbows.rubyforge.org/index.html) che è un altro server rack molto buona per le richieste aperte.

Ecco anche un thread relativi a discussioni in streaming appeso https://github.com/rails/rails/issues/10989

8

Devi cambiare le impostazioni di ambiente di sviluppo per attivare questa funzione.

aggiungere o modificare questo nel tuo config/ambienti/development.rb:

config.cache_classes = true 
config.eager_load = true 

Vedi http://railscasts.com/episodes/401-actioncontroller-live?view=asciicast

+1

Ho questo problema nell'ambiente di produzione, non nello sviluppo ... – Philip

+0

Questo in realtà risolve il problema nel mio caso. Grazie molto. –