延迟::乔布斯在Heroku上运行两次?

时间:2011-08-12 13:01:29

标签: heroku delayed-job worker

我在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个网络dynos,并拥有一个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上工作的版本。

非常感谢任何建议。这对我们的网站来说非常糟糕。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Heroku调度程序,则不需要更多工作人员。 Heroku将独立收取其cron小时。

您确定延迟作业执行代码不会引发异常吗?如果是,则作业将根据重试变量(Delayed :: Worker.max_attempts)再次排队,因此可能导致重新安排。