Ich versuche Text/Event-Stream mit Rails 4 Live Streaming zu implementieren. Es funktioniert gut und das einzige Problem, das ich traf, ist, dass ich nicht überprüfen kann, ob die Verbindung aktiv ist, ohne irgendwelche Nachrichten zu senden.ActionController :: LIve Ist es möglich zu überprüfen, ob die Verbindung noch besteht?
Die einzige Lösung, die ich herausgefunden habe, ist, einen unterstützenden Kanal mit einem zyklischen Tick-Generator zu erzeugen, so dass einige Hintergrund-Tasks Nachrichten dort periodisch senden werden. Aber es scheint chaotisch und nicht zuverlässig zu sein. Irgendwelche besseren Lösungen?
Hier ist mein Controller:
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
Eine weitere Option hier detailliert: http://StackOverflow.com/a/19485363/928963 –
Sieht aus wie genau das gleiche wie unten gezeigt, außer dass es Redis für die Ausgabe von Taktsignal verwendet, die komplexer ist. Und wie funktioniert es unter Last? Initialisiert der Initializer nicht bei jeder Anfrage? Dies kann den Pub/Sub-Kanal überlasten und jeder Client erhält Nachrichten von allen Clients. –
Die Lösung, die Sie unten haben, feuert einen zusätzlichen Ticker-Thread pro Clientverbindung ab. Die Lösung, die ich in meiner Antwort, auf die ich Bezug genommen habe, vorgeschlagen habe, hat einen einzelnen Thread, um diese Ticker herauszuschieben, der etwas besser skaliert. (Und das Einfügen in den Initialisierer erzeugt einen Thread pro Rails-Prozess, nicht pro Client-Verbindung) –