6

Heroku での Delayed::Job の実行に問題があります。遅延実行のためにキューに入れられたジョブのほとんどは、 2 回(場合によっては 1 回だけ) 実行されます。そのため、ほとんどの Sendgrid メールは重複して送信され、ActiveMerchant トランザクションのほとんどは 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 の Web dyno を実行し、Ronin データベースを持っています。プラグインに関しては、次のものがあります。

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

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

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

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 で動作するようになったのはこれだけでした。

提案をいただければ幸いです。これは当サイトにとって非常に悪いことです。

4

1 に答える 1

1

Herokuスケジューラーを使用している場合は、そのため、これ以上のワーカーは必要ありません。Herokuはcron時間を個別に課金します。

遅延したジョブ実行コードが例外を発生させていないことを確認しますか?そうである場合、ジョブは再試行変数(Delayed :: Worker.max_attempts)に従って再度キューに入れられるため、再スケジュールが発生する可能性があります。

于 2012-08-06T03:21:33.057 に答える