6

我在 Heroku 上运行 Delayed::Job 时遇到问题。大多数排队等待延迟执行的作业会运行两次(有时只运行一次)。因此,我的大部分 Sendgrid 电子邮件都是重复发送的,而我的大部分 ActiveMerchant 交易都试图自行结算两次!

我们在 Heroku 实例上运行了 2 个工作人员。巧合?我认为我们需要两个,因为我们还有一个用于备份和东西的 cron。

两次发生的工作彼此重叠(非常接近)。这是一个竞争条件,但由什么引起的?

具体如下:

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

我们运行 10 个网络测功机,并拥有一个 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 回答