ActionController :: Live Можно ли проверить, живо ли соединение?
Я пытаюсь реализовать поток text/event, используя Rails 4 Live streaming. Он отлично работает, и единственная проблема, с которой я столкнулся, заключается в том, что я не могу проверить, жив ли соединение, не отправляя никаких сообщений.
Единственное решение, которое я выяснил, - создать вспомогательный канал с генератором циклических тиков, чтобы некоторая фоновая задача периодически отправляла туда сообщения. Но это кажется грязным и ненадежным. Какие-нибудь лучшие решения?
Вот мой контроллер:
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
Ответы
Ответ 1
Хорошо, я нашел два варианта:
1) Забавно, но не хорошо (поскольку я не получил то, что я должен использовать для обработки 1000 параллельных соединений):
begin
ticker = Thread.new { loop { sse.write 0; sleep 5 } }
sender = Thread.new do
redis.subscribe(:info, :chat) do |on|
on.message do |event, message|
sse.write(message, :event => event.to_s)
end
end
end
ticker.join
sender.join
rescue IOError
ensure
Thread.kill(ticker) if ticker
Thread.kill(sender) if sender
track.close
sse.close
end
2) Удивительно. Использовать сервер Goliath. Оказалось, что он может проверить, не потеряно ли соединение без какого-либо тикера. По дороге в Голиаф обнаружил судорогу. Это легкий и, надеюсь, быстрый, но, похоже, он оставлен.