2013-08-05 8 views
7

Ich versuche, Rails 4 Live Streaming-Komponente zu verwenden. Es funktioniert alles außer, dass es scheint, als ob der Stream offen bleibt und neue Anfragen blockiert.Rails 4, Live-Streaming, bleibt offen, blockiert Anfragen

Wie kann ich sicherstellen, dass die Verbindung beim Schließen oder Klicken auf einen neuen Link innerhalb der Anwendung ordnungsgemäß beendet wird?

Dies ist mein Live-Event-Controller.

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 

Datenbank conf

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

I Puma als eigenständige Webserver bin mit auf Ubuntu 10.04 mit postgresql 9.2.x. (i, die von nginx bedient werden keine schweren statische Dateien haben müssen)

+0

Sind Sie jemals in der Lage, dieses Problem zu lösen? Dans Antwort ist eine gute Zusammenfassung dessen, was vor sich geht, aber beantwortet die Frage nicht ganz (ich nehme auch für Sie an, da Sie es nicht akzeptiert haben). –

+1

@Teeg Wie du geschrieben hast, ist es eine gute Zusammenfassung, aber es hat meine Frage nicht gelöst. Ich habe stattdessen Faye benutzt, was traurig ist, weil ich wirklich wollte, dass das richtig funktioniert. – Philip

+1

Das ist schade. Ich habe eine [ähnliche Frage] (http://stackoverflow.com/q/18970458/877472) gepostet, die eine doof Lösung enthält. Ich werde dich wissen lassen, ob ich es jemals herausfinden werde. –

Antwort

2

Puma sollte nicht blockiert werden und sollte mehreren Threads erlauben, mehrere Anfragen zuzulassen.

Um Sie durch was passiert in Ihrem Code zu gehen. Sie verwenden derzeit zwei Threads in diesem Code pro Anfrage. Der Thread, in dem die Anfrage eingegangen ist, und ein Hintergrundthread, mit dem die Verbindung geöffnet wurde.

Ihre Verbindungen werden aufgrund des Sicherstellungsblocks am Ende Ihrer Aktionsmethode ordnungsgemäß geschlossen.

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 

Sie könnten auch eine anderen Server mit dem Namen Regenbogen (http://rainbows.rubyforge.org/index.html) untersuchen, die ein weiterer sehr guter Rack-Server für offene Anfragen ist.

Hier ist auch ein Thread zu Streaming-Threads im Zusammenhang hängt https://github.com/rails/rails/issues/10989

8

Sie haben die Entwicklungsumgebung Einstellungen zu ändern, um diese Funktion zu aktivieren.

hinzufügen oder diese in Ihrer config/Umgebungen/development.rb ändern:

config.cache_classes = true 
config.eager_load = true 

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

+1

Ich habe dieses Problem in der Produktionsumgebung, nicht Entwicklung ... – Philip

+0

Dies löst tatsächlich das Problem in meinem Fall. Danke vielmals. –