ruby on rails - español - Los trabajadores de Rails Resque fallan con PGError: el servidor cerró la conexión inesperadamente
ruby on rails tutorial español pdf (5)
Cambiar la configuración de Apache y agregar
PassengerSpawnMethod conservative
Tengo un sitio que ejecuta la aplicación de rieles y los trabajadores de resque ejecutan en modo de producción, en Ubuntu 9.10, Rails 2.3.4, ruby-ee 2010.01, PostgreSQL 8.4.2
Los trabajadores constantemente generan errores: PGError: el servidor cerró la conexión inesperadamente.
Mi mejor opción es que el proceso maestro resque establece la conexión a db (p. Ej. Authlogic cuando usa User.acts_as_authentic), mientras se cargan las clases de aplicación de rieles, y esa conexión se corrompe en el proceso fork () ed (¿al salir?) los niños obtienen una especie de roto Global ActiveRecord :: Base.connection
Podría reproducir un comportamiento muy similar con este código de ejemplo que imita la horquilla / procesamiento en resque worker. (AFAIK, los usuarios de libpq recomendados para recrear conexiones en el proceso bifurcado de todos modos, de lo contrario no es seguro)
Pero, lo extraño es que cuando uso pgbouncer o pgpool-II en lugar de la conexión pgsql directa, tales errores no aparecen.
Entonces, la pregunta es dónde y cómo debo excavar para descubrir por qué está roto para una conexión simple y está trabajando con grupos de conexiones. O una solución razonable?
Cuando creé a Nestor , tuve el mismo tipo de problema. La solución fue restablecer la conexión en el proceso bifurcado. Vea el código relevante en http://github.com/francois/nestor/blob/master/lib/nestor/mappers/rails/test/unit.rb#L162
Desde mi aspecto muy limitado en el código de Resque, creo que una llamada a #establish_connection se debe hacer aquí: https://github.com/resque/resque/blob/master/lib/resque/worker.rb#L123
Después de hacer un poco de investigación / prueba y error. Para cualquiera que se encuentre con el mismo problema. Para aclarar qué gc mencionado.
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }
El código anterior debe colocarse en: /lib/tasks/resque.rake
Por ejemplo:
require ''resque/tasks''
task "resque:setup" => :environment do
ENV[''QUEUE''] = ''*''
Resque.after_fork do |job|
ActiveRecord::Base.establish_connection
end
end
desc "Alias for resque:work (To run workers on Heroku)"
task "jobs:work" => "resque:work"
Espero que esto ayude a alguien, tanto como lo hizo por mí.
No puede pasar una referencia libpq a través de un tenedor () (o a un nuevo hilo), a menos que su aplicación tenga mucho cuidado de no usarla de manera conflictiva. (Como, un mutex alrededor de cada intento de usarlo, y nunca debes cerrarlo). Esto es lo mismo para las conexiones directas y el uso de pgbouncer. Si funcionó en pgbouncer, eso fue pura suerte al perder una condición de carrera por alguna razón, y eventualmente se romperá.
Si su programa usa bifurcación, debe crear la conexión después de la bifurcación.
Tuve este problema con todas mis clases de Mailer y necesitaba llamar a ActiveRecord::Base.verify_active_connections!
dentro de los métodos de envío para asegurar que se haya hecho una conexión.