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, мог его увидеть.