2011-08-12 19 views
5

Tengo un problema al ejecutar Delayed :: Job en Heroku. La mayoría de los trabajos que están en cola para la ejecución demorada se ejecutan dos veces (ocasionalmente solo la vez). Así que la mayoría de mis correos electrónicos de Sendgrid se envían por duplicado, ¡y la mayoría de mis transacciones de ActiveMerchant intentan establecerse dos veces!Retrasado :: ¿Trabajos corriendo dos veces en Heroku?

Tenemos 2 trabajadores ejecutándose en nuestra instancia de Heroku. ¿Coincidencia? Creo que necesitamos dos porque también tenemos un cron para copias de seguridad y esas cosas.

Los trabajos que se producen dos veces se producen uno encima del otro (inconmensurablemente cerca). Es una condición de carrera, pero causada por qué?

Los detalles son los siguientes:

$ heroku stack 
    aspen-mri-1.8.6 
    bamboo-mri-1.9.2 
* bamboo-ree-1.8.7 
    cedar (beta) 

corremos 10 dinamómetros web, y tienen una base de datos Ronin. Plugin-sabia que tenemos:

Basic Release Management FREE 
Cron Daily Cron FREE 
Custom Domains FREE 
Expanded Logging FREE 
Hostname SSL 20.00 PER MONTH 
PG Backups Basic FREE 
Sendgrid Pro 20.00 PER MONTH 
Shared Database 5MB FREE 

En Gemfile:

gem 'rails', '3.0.6' 
gem 'delayed_job', :git => 'git://github.com/collectiveidea/delayed_job.git', :tag => 'v2.1.2' # 3.x doesn't seem to work with Heroku 

Mis manejadores de aspecto:

class OrderEmailJob < Struct.new(:order_id, :email_type) 
    def perform 
    OrderMailer.send(email_type, Order.find(order_id)).deliver 
    end 
end 

y en cola como:

Delayed::Job.enqueue OrderEmailJob.new(self.id, :order_confirmation) 

Probé un montón de diferentes versiones de DJ, pero este fue el único Podría ir a trabajar, tal como es, en Heroku.

Realmente agradecería cualquier sugerencia. Esto es muy malo para nuestro sitio.

+0

debe publicar su trabajo y código cron. – s84

+0

por lo que tiene una definición 'enviar' en su anuncio publicitario? – s84

+0

@Codeglot No, ese es el método de envío ruby ​​http://ruby-doc.org/core/classes/Object.html#M000999. – user874500

Respuesta

0

Si está utilizando los programadores de Heroku, no necesita más trabajadores debido a ello. Heroku cargará su hora cron independientemente.

¿Está seguro de que el código de trabajo retrasado no está generando una excepción? Si es así, el trabajo se pondrá nuevamente en cola de acuerdo con la variable de reintento (Delayed :: Worker.max_attempts), por lo que podría provocar una reprogramación.