7

Rails 4 Live Streaming コンポーネントを使用しようとしています。ストリームが開いたままになり、新しいリクエストをブロックしているように見えることを除いて、すべて機能します。

アプリケーションを閉じたとき、またはアプリケーション内の新しいリンクをクリックしたときに、接続が適切に閉じられるようにするにはどうすればよいですか?

これは私のライブ イベント コントローラーです。

  def events
    response.headers["Content-Type"] = "text/event-stream"
    redis = Redis.new
    redis.psubscribe("participants.*") do |on|
      on.pmessage do |pattern, event, data|
        response.stream.write("event: #{event}\n")
        response.stream.write("data: #{data}\n\n")
      end
    end
  rescue IOError
  ensure
    redis.quit
    response.stream.close
  end

データベース設定

production:
  adapter: postgresql
  encoding: unicode
  database: ************
  pool: 1000
  username: ************
  password: ************
  timeout: 5000

postgresql 9.2.xを搭載したUbuntu 10.04で、スタンドアロンWebサーバーとしてpumaを使用しています(nginxが提供する必要のある重い静的ファイルはありません)。

4

2 に答える 2

2

Puma はブロックされるべきではなく、複数のスレッドが複数のリクエストを許可できるようにする必要があります。

コードで何が起こっているかを順を追って説明します。現在、このコードではリクエストごとに 2 つのスレッドを使用しています。リクエストが入ったスレッドと、接続を開いたままにするために使用されるバックグラウンド スレッド。

アクション メソッドの末尾にある ensure ブロックにより、接続が適切に閉じられます。

def events
  response.headers["Content-Type"] = "text/event-stream"
  redis = Redis.new
  # blocks the current thread
  redis.psubscribe("participants.*") do |on|
    on.pmessage do |pattern, event, data|
      response.stream.write("event: #{event}\n")
      response.stream.write("data: #{data}\n\n")
    end
  end
  # stream is on a background thread and will remain open until
  # redis.psubscrie exits. (IO Error, etc)
rescue IOError
ensure
  redis.quit
  response.stream.close
end

また、オープン リクエスト用の別の非常に優れたラック サーバーであるrainbows ( http://rainbows.rubyforge.org/index.html ) と呼ばれる別のサーバーを調査することもできます。

ストリーミング スレッドのハングに関するスレッドもここにあります https://github.com/rails/rails/issues/10989

于 2013-08-26T23:30:00.880 に答える