tutorial rails español ruby-on-rails ruby postgresql activerecord resque

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?



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.