2011-08-12 15 views
5

Delayed :: Job on Heroku'da çalışırken bir sorun yaşıyorum. Gecikmeli yürütme için sıraya alınan işlerinin çoğu, iki kez (yalnızca bir kez) çalıştı. Bu yüzden SendGrid e-postalarımın çoğu çoğaltılarak gönderiliyor ve ActiveMerchant işlemlerimin çoğu kendilerini iki kez ödüllendirmeye çalışıyor!Gecikmeli :: İşler Heroku'da İkili Kaçıyor?

Heroku örneğimizde 2 çalışanımız var. Tesadüf? Sanırım ikiye ihtiyacımız var çünkü yedekler ve şeyler için de bir cronumuz var.

İki kez meydana gelen işler birbirinin üstünde meydana gelir (ölçülemeyen derecede yakın). Bu bir yarış durumu, ama neden oldu?

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

Biz 10 web dinamometre çalıştırın ve bir Ronin veritabanı:

özellikleri şunlardır. Eklenti-bilge Elimizdeki: Gemfile yılında

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 

:

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 

Benim işleyicileri

benziyor:

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

ve benzeri sıraya alınmış:

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

Ben çok çalıştım DJ'in farklı versiyonları ama bu sadece biriydi Heroku'da olduğu gibi çalışabilirim.

Gerçekten herhangi bir öneriniz için teşekkür ederiz. Bu sitemiz için çok kötü.

+0

İşinizi ve kod kodunu göndermelisiniz. – s84

+0

, böylece maillerinizde bir '' gönderim 'tanımınız var mı? – s84

+0

@Codeglot Hayır, ruby ​​gönderme yöntemi budur http://ruby-doc.org/core/classes/Object.html#M000999. – user874500

cevap

0

Heroku Zamanlayıcılarını kullanıyorsanız, bunun için daha fazla işçiye ihtiyacınız yoktur. Heroku cron saatini bağımsız olarak şarj eder.

Gecikmeli iş gerçekleştirme kodunun yükseltme istisnası olmadığından emin misiniz? Öyleyse, yeniden deneme değişkenine (Gecikmeli :: Worker.max_attempts) göre iş yeniden sıraya alınacak ve bu da yeniden zamanlamaya neden olabilir.