Pregunta

he carriles sitio en funcionamiento de aplicaciones y trabajadores resque ejecuta en el modo de producción, en Ubuntu 9.10, Rails 2.3.4, rubí-EE 2010.01, PostgreSQL 8.4.2

trabajadores errores constantemente planteadas: PGError:. Servidor ha cerrado la conexión de forma inesperada

Mi mejor conjetura es que el proceso resque maestro establece conexión con db (por ejemplo authlogic hace que cuando uso User.acts_as_authentic), mientras que los carriles de carga clases de aplicaciones, y esa conexión se daña en el tenedor () ed proceso (en la salida?), para que los niños reciben próxima bifurcadas tipo de roto ActiveRecord :: mundial Base.connection

pude reproducir comportamiento muy similar con este código imitando tenedor / procesamiento de trabajador resque muestra. (Que yo sepa, los usuarios de libpq recomienda para recrear las conexiones de proceso en forma de horquilla de todos modos, de lo contrario, no es seguro)

Pero, es que cuando uso pgbouncer o pgpool-II en lugar de la conexión directa pgsql, no se descubra lo raro este tipo de errores.

Entonces, la pregunta es dónde y cómo debería excavar para descubrir por qué se rompe para la conexión simple y está trabajando con las agrupaciones de conexiones? O una solución razonable?

¿Fue útil?

Solución

Cuando creé Nestor , que tenía el mismo tipo de problema. La solución era volver a establecer la conexión en el proceso en forma de horquilla. Ver el código correspondiente en http : //github.com/francois/nestor/blob/master/lib/nestor/mappers/rails/test/unit.rb#L162

Desde mi muy aspecto limitado al código Resque, creo que una llamada a #establish_connection debe hacerse justo por aquí: https://github.com/resque/resque/blob/master/lib/resque/worker.rb#L123

Otros consejos

Después de hacer un poco de investigación / ensayo y error. Para cualquier persona que viene a través de la misma edición. Para aclarar lo mencionó GC.

Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection }

código de seguridad 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 se puede pasar una referencia libpq a través de un tenedor () (o para un nuevo hilo), a menos que su aplicación tiene muy cerca cuidado de no usarlo en conflicto maneras. (Como, por un mutex alrededor de cada intento de usarlo, y nunca deberá cerrarlo). Este es el mismo tanto para las conexiones directas y utilizando pgbouncer. Si funcionó en pgbouncer, que fue pura suerte en falta una condición de carrera por alguna razón, y con el tiempo se rompa.

Si sus usos programa que se bifurcan, que debe crear la conexión después el tenedor.

Cambiar configuración de Apache y complemento

PassengerSpawnMethod conservative

tuve este problema con todas mis clases Mailer y necesitaba llamar ActiveRecord::Base.verify_active_connections! dentro de los métodos anuncio publicitario con el fin de garantizar una conexión fue hecha.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top