17

Rails 4 のライブ ストリーミングを使用して text/event-stream を実装しようとしています。それはうまく機能し、私が遭遇した唯一の問題は、メッセージを送信せずに接続が有効かどうかを確認できないことです.

私が考え出した唯一の解決策は、循環ティックジェネレーターでサポートチャネルを作成して、バックグラウンドタスクが定期的にメッセージを送信するようにすることです。しかし、それは面倒で信頼性がないようです。より良い解決策はありますか?

これが私のコントローラーです:

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
4

1 に答える 1

10

わかりました、2 つのオプションが見つかりました。

1) 面白いですが、良くありません (数千の並列接続を処理するために使用するサーバーを取得できなかったため):

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 サーバーを使用するには。ティッカーなしで接続が失われたかどうかを確認できることが判明しました。ゴリアテに向かう途中でクランプを見つけました。軽量で、できれば高速ですが、放棄されているようです。

于 2013-01-12T00:35:02.520 に答える