2011-08-12 20 views
5

私はHerokuでDelayed :: Jobを実行する際に問題があります。遅延実行のためにキューに入れられたジョブのほとんどは、の2回実行されます(たまに1回のみ)。だから、私のSendgridの電子メールのほとんどは二重に送られてきました。そして、私のActiveMerchant取引の大部分は、自分自身を2回解決しようとしています!Delayed :: Herokuで2回実行中のジョブ?

私たちはHerokuのインスタンスで2人のワーカーを実行しています。一致?私はバックアップと物事のためのcronも持っているので、2つが必要だと思う。

2回発生するジョブは、互いに重なり合って(計り知れないほど近くに)発生します。競合状態ですが、原因は何ですか?

詳細は以下のとおりです。

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

は、我々は10件のウェブdynosを実行し、浪人のデータベースを持っています。プラグインワイズ我々は持っている:Gemfileで

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 

私のハンドラは次のようになります。

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

と同様にキューイングされている:私は多くを試してみました

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

異なったバージョンのDJが、これは唯一のものでした私はHerokuのような仕事をすることができました。

本当にありがとうございます。これは私たちのサイトにとって非常に悪いことです。

+0

あなたの仕事とcronコードを投稿する必要があります。 – s84

+0

あなたのメーラーに 'send'という定義がありますか? – s84

+0

@Codeglotいいえ、それはルビーの送信方法http://ruby-doc.org/core/classes/Object.html#M000999です。 – user874500

答えて

0

ヘロクスケジューラを使用している場合は、そのために多くのワーカーが必要ありません。 Herokuは独自にcron時間を請求します。

遅延ジョブの実行コードで例外が発生していませんか?そうであれば、再試行変数(Delayed :: Worker.max_attempts)に従ってジョブが再びキューに入れられ、再スケジュールが発生する可能性があります。

関連する問題