Подтвердить что ты не робот

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
4b9b3361

Ответ 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. Оказалось, что он может проверить, не потеряно ли соединение без какого-либо тикера. По дороге в Голиаф обнаружил судорогу. Это легкий и, надеюсь, быстрый, но, похоже, он оставлен.