Próbuję zaimplementować tekst/strumień zdarzeń za pomocą transmisji strumieniowej na żywo Rails 4. Działa świetnie i jedyny problem, jaki napotkałem, to to, że nie mogę sprawdzić, czy połączenie jest żywe bez wysyłania jakichkolwiek wiadomości.ActionController :: LIve Czy można sprawdzić, czy połączenie jest nadal aktywne?
Jedyne rozwiązanie, jakie wymyśliłem, to utworzenie kanału wspomagającego z cyklicznym generatorem znaczników, aby niektóre zadania w tle wysyłały tam okresowo komunikaty. Ale wydaje się być niechlujny i niewiarygodny. Jakieś lepsze rozwiązania?
Oto mój kontroler:
require 'persistency/sse'
require 'persistency/track'
class PersistencyController < ApplicationController
include ActionController::Live
def stream
response.headers['Content-Type'] = 'text/event-stream'
sse = Persistency::SSE.new(response.stream)
track = Persistency::Track.new(current_user)
redis = Redis.new
begin
redis.subscribe(:info, :chat) do |on|
on.message do |channel, message|
sse.write({ :message => message }, :event => channel)
end
end
rescue IOError
ensure
track.close
sse.close
end
end
end
Kolejna opcja opisana tutaj: http://stackoverflow.com/a/19485363/928963 –
Wygląda dokładnie tak samo, jak pokazano poniżej, z wyjątkiem tego, że używa redis do wysyłania sygnału zegara, który jest bardziej złożony. I w końcu, jak będzie działać pod obciążeniem? Czy inicjalizator nie uruchamia się na każde żądanie? Może to spowodować przeciążenie kanału pub/sub, a każdy klient otrzyma wiadomości od wszystkich klientów. –
Rozwiązanie, które masz poniżej, wyzwala dodatkowy wątek na klienta. Rozwiązanie, które zaproponowałem w mojej odpowiedzi, do której się odwołałem, ma jeden wątek do wypychania tych tickerów, który jest nieco lepszy. (I, umieszczając go w inicjalizatorze tworzy jeden wątek na proces szyny, a nie na połączenie klienta) –