Resque trabajador falla con PostgreSQL Server
-
26-10-2019 - |
Pregunta
He logrado configurar a mis trabajadores y solían ejecutar sin problemas (en desarrollo), pero ahora no lo hacen en producción o desarrollo (supongo que después de cambiar de SQLITE3 a Postgresql).
Cuando ejecuto un comando de rastrillo para ejecutar a los trabajadores con rake resque:work QUEUE=*
Recibo el siguiente error y traza de pila:
getaddrinfo: nodename nor servname provided, or not known
Recibo los siguientes errores al ejecutar heroku rake resque:work QUEUE=*
en la consola para probar a los trabajadores pendientes en la cola.
Class SentimentJob
Arguments [4, 5, 6]
Exception ActiveRecord::StatementInvalid
Error PGError: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request.
: SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc,
a.attnotnull FROM pg_attribute a LEFT JOIN pg_attrdef d ON a.attrelid =
d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = '"taggings"'::regclass
AND a.attnum > 0 AND NOT a.attisdropped ORDER BY a.attnum
Y para mi trabajador de Facebook:
Class FBConnectionsJob
Arguments 1
Exception OpenSSL::SSL::SSLError
Error SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B:
certificate verify failed
Class FBConnectionsJob
Arguments 1
Exception ActiveRecord::StatementInvalid
Error PGError: server closed the connection unexpectedly This probably means
the server terminated abnormally before or while processing the request.
: SELECT tablename FROM pg_tables WHERE schemaname = ANY
(current_schemas(false))
¿Por qué obtengo diferentes errores en diferentes entornos? Mis archivos inicializadores se ven como:
¿Debo agregar especificaciones Env aquí?
Resque.rb
uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }
Redis.rb
uri = URI.parse(ENV["REDISTOGO_URL"])
REDIS = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
Resque.redis = REDIS
Mi entornos/producción.RB El archivo no tiene referencia a Redis y mi entornos/desarrollo.rb El archivo tiene esto para la configuración de Redis:
ENV["REDISTOGO_URL"] = 'redis://username:password@my.host:6789'
Solución
Agregar lo siguiente a mi filtro de rastrillo solucionó un problema similar para mí:
task "resque:setup" => :environment do
Resque.before_fork = Proc.new { ActiveRecord::Base.establish_connection }
end
Esto reconecta PostgreSQL antes de que Resque bifle en su proceso para crear un trabajador.
Otros consejos
Parece que su aplicación no puede conectarse al servidor Redis. ¿Proporcionó detalles de conexión válidos para el entorno de producción? ¿Está disponible el servidor Redis? ¿No es detrás del firewall hay alguna red privada?
Creo que podría ser el mismo problema con el servidor PostgreSQL de producción.
He cambiado los inicializadores a lo siguiente y ahora funciona en localhost, por lo que @Mirtinciu tenía razón sobre la conexión del servidor. Todavía necesita averiguar qué está mal en el servidor de producción.
if Rails.env.development?
uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => 'localhost', :port => '6379')
else
uri = URI.parse(ENV["REDISTOGO_URL"])
Resque.redis = Redis.new(:host => uri.host, :port => uri.port, :password => uri.password)
end
Creo que es un duplicado y se resuelve restaurando la conexión Activerecord:Los trabajadores de Rails resque fallan con PGERROR: el servidor cerró la conexión inesperadamente