Rails 4 - Live, соединение продолжается даже после обновления

Я создал приложение, которое использует метод Live в Rails 4. Однако, когда я использую его, каждое обновление продолжает принимать еще одно соединение, пока не достигнет максимума соединений с БД, а затем просто зависает и загружается вечно.

Что я могу сделать, чтобы отключить соединение, когда пользователь обновляет сайт или решает покинуть его?

Это моя установка:

  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
    logger.info "Stream closed"
  ensure
    redis.quit
    response.stream.close
  end

Я использую Nginx с Rainbows! на Ubuntu 10.04. Ruby 2.0.0-p195 Postgresql Rails 4

1 ответ

Так что, если бы вы делали эту логику в потоке, который создали сами, мой ответ был бы заключен в следующее:

def events
  ActiveRecord::Base.connection_pool.with_connection do
    response.headers[etc
    #..
  end
end

Теперь вы не делаете свой собственный поток. Исходя из ваших симптомов, я подозреваю, что это может решить вашу проблему в любом случае, было бы интересно увидеть.

Однако, вероятно, в этом нет необходимости, поскольку ActionController::Live является официально поддерживаемой частью Rails, а документация и примеры не говорят о том, что вам нужно делать with_connection вещь. Я не знаком с ActionController::Live себя; Похоже, что это может быть ошибка. Возможно, вы захотите подать файл с помощью трекера проблем Rails после создания максимально маленького приложения, которое демонстрирует проблему.

Я подозреваю, что в вашем приложении происходит больше, чем вы нам показываете - метод, который вы показали нам, вообще не использует ActiveRecord, поэтому нет никаких причин, по которым он вообще будет использовать какие-либо подключения к базе данных. Или подождите, под "соединениями с базой данных" вы на самом деле имеете в виду Redis? Если это так, то проигнорируйте весь этот ответ, как я предполагал ActiveRecord. У меня тоже нет опыта работы с Redis, но если под "соединениями с базой данных" вы подразумеваете Redis, то это проблема Redis, и вы можете попытаться зарегистрировать проблему на трекере проблем Redis. Или, по крайней мере, пометить этот вопрос как "redis", чтобы кто-то, кто знает redis, мог его увидеть.

Другие вопросы по тегам