Rails 4, Live Streaming, остается открытым, блокирует запросы

Я пытаюсь использовать компонент 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

Я использую puma в качестве автономного веб-сервера (у меня нет тяжелых статических файлов, которые должны обслуживаться nginx) на Ubuntu 10.04 с postgresql 9.2.x.


person Philip    schedule 05.08.2013    source источник
comment
Вам когда-нибудь удавалось решить эту проблему? Ответ Дэна является хорошим изложением того, что происходит, но не совсем отвечает на вопрос (я полагаю, что и для вас, поскольку вы его не приняли).   -  person Paul Richter    schedule 24.09.2013
comment
@Teeg Как вы написали, это хорошее резюме, но оно не решило мой вопрос. Вместо этого я использовал Faye, что грустно, потому что я действительно хотел, чтобы это работало правильно.   -  person Philip    schedule 24.09.2013
comment
Это очень плохо. Я опубликовал похожий вопрос, содержащий глупое решение. Я дам тебе знать, если когда-нибудь разберусь.   -  person Paul Richter    schedule 24.09.2013
comment
Спасибо @Teeg, жду с нетерпением =)   -  person Philip    schedule 25.09.2013


Ответы (2)


Вы должны изменить настройки среды разработки, чтобы включить эту функцию.

Добавьте или измените это в вашем config/environments/development.rb:

config.cache_classes = true
config.eager_load = true

См. http://railscasts.com/episodes/401-actioncontroller-live?view=asciicast

person Michael Schäfermeyer    schedule 06.09.2013
comment
Это фактически решает проблему в моем случае. Большое спасибо. - person Nafaa Boutefer; 02.11.2015

Puma не должна блокировать и должна разрешать нескольким потокам разрешать несколько запросов.

Чтобы показать вам, что происходит в вашем коде. В настоящее время вы используете два потока в этом коде для каждого запроса. Поток, в который поступил запрос, и фоновый поток, используемый для удержания соединения открытым.

Ваши соединения будут правильно закрыты из-за блока обеспечения в конце вашего метода действий.

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

person Dan    schedule 26.08.2013