Я использую глобальную переменную в приложении rails для хранения клиента Redis с помощью гема Redis. В config/initializers/redis.rb
у меня есть
$redis = Redis.new(host: "localhost", port: 6379)
Затем в коде приложения я использую $redis
для работы с данными в хранилище Redis.
Я также использую puma в качестве веб-сервера в рабочей среде и capistrano для развертывания кода. В процессе развертывания capistrano перезапускает puma.
Каждый раз, когда я запускаю или перезапускаю веб-серверы puma, я всегда получаю «Внутреннюю ошибку сервера», когда впервые использую $redis
для доступа к данным в хранилище Redis. Я видел такие ошибки, как Redis::InheritedError (Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.)
Поиск в Google и stackoverflow привел меня к мысли, что мне нужно повторно подключиться к Redis после того, как puma разветвит дочерние процессы. Итак, я добавил в свой config/puma.rb
:
on_worker_boot do
$redis.ping
end
Но я все еще получал «Внутреннюю ошибку сервера», вызванную Redis::InheritedError (Tried to use a connection from a child process without reconnecting. You need to reconnect to Redis after forking.)
.
Я видел этот пост http://qiita.com/yaotti/items/18433802bf1720fc0c53. Затем я попытался добавить в config/puma.rb
:
on_restart do
$redis.quit
end
Это не сработало.
Я пробовал с config/initializers/redis.rb
по $redis.ping
сразу после Redis.new
. Это тоже не сработало.
Я получил эту ошибку, если puma была запущена без запущенных процессов puma или перезапущена, когда запущен экземпляр процесса puma.
Обновление страницы избавит меня от этой ошибки. Но я хочу избавиться от этого еще при первой попытке использовать $redis
. Я думал, что я не использовал гем redis
или неправильно настроил его переподключение. Может ли кто-нибудь сказать мне:
- Это правильный способ использования
redis
gem в приложении rails? - Как переподключить соединение
redis
вpuma
?
В документации puma
gem говорится: «Вы должны поместить в этот блок код для закрытия глобальных файлов журналов, соединений Redis и т. д., чтобы их файловые дескрипторы не просачивались в перезапущенный процесс. в конечном итоге неясные сбои, поскольку сервер много раз перезагружается». Речь шла о блоке on_restart
. Но не сказано, как это должно быть сделано.
ensure_connected
-метод redis-rb, но я не уверен в побочных эффектах, которые это будет иметь - person Simon Woker   schedule 12.09.2013