2013-08-05 13 views
7

Próbuję użyć komponentu Rails 4 Live Streaming. Wszystko działa, ale wygląda na to, że strumień pozostaje otwarty i blokuje nowe żądanie.Rails 4, transmisja na żywo, pozostaje otwarta, blokuje żądania

Jak mogę się upewnić, że połączenie zostanie poprawnie zamknięte po zamknięciu lub kliknięciu nowego łącza w aplikacji?

To jest kontroler zdarzeń na żywo.

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 

Używam puma jako samodzielny serwer WWW (nie mam dużych plików statycznych, które muszą być podawane przez nginx) na Ubuntu 10.04 z PostgreSQL 9.2.x.

+0

Czy byłeś kiedykolwiek w stanie rozwiązać ten problem? Odpowiedź Dana jest dobrym podsumowaniem tego, co się dzieje, ale nie do końca odpowiada na pytanie (zakładam również dla ciebie, ponieważ nie zaakceptowałeś tego). –

+1

@Teeg Jak napisałeś, jest to dobre podsumowanie, ale nie rozwiązało to mojego pytania. Zamiast tego użyłem Faye, co jest smutne, ponieważ naprawdę chciałem, żeby to działało poprawnie. – Philip

+1

To zbyt źle. Wysłałem [podobne pytanie] (http://stackoverflow.com/q/18970458/877472), które zawiera głupkowate rozwiązanie. Dam ci znać, jeśli kiedykolwiek to wymyślę. –

Odpowiedz

2

Puma nie powinna blokować i powinna umożliwiać wielu wątkom dopuszczanie wielu żądań.

Przejść przez to, co dzieje się w kodzie. Aktualnie używasz dwóch wątków w tym kodzie dla każdego żądania. Wątek, w którym przyszło żądanie, i wątek tła używany do przytrzymania połączenia.

Twoje połączenia zostaną poprawnie zamknięte z powodu zapewnienia blokady na końcu metody działania.

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 

Można również zbadać inny serwer o nazwie tęcze (http://rainbows.rubyforge.org/index.html), który jest kolejny bardzo dobry serwer rack dla otwartych żądań.

Tutaj jest również wątek związany z strumieniowych wątków wiszące https://github.com/rails/rails/issues/10989

8

Musisz zmienić ustawienia środowisko programistyczne, aby włączyć tę funkcję.

dodać lub zmienić to w config/środowiskach/development.rb:

config.cache_classes = true 
config.eager_load = true 

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

+1

Mam ten problem w środowisku produkcyjnym, a nie rozwoju ... – Philip

+0

To faktycznie rozwiązuje problem w moim przypadku. Wielkie dzięki. –

Powiązane problemy