Задержка :: Работа, выполняемая дважды на Heroku? - PullRequest
5 голосов
/ 12 августа 2011

У меня проблема с запуском Delayed :: Job на Heroku. Большинство заданий, находящихся в очереди для отложенного выполнения, выполняются дважды (иногда только один раз). Поэтому большинство моих писем 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)

Я пробовал много разных версий диджея, но это была единственная, которую я смог заставить работать, например, на Heroku.

Буду очень признателен за любые предложения. Это очень плохо для нашего сайта.

1 Ответ

0 голосов
/ 06 августа 2012

Если вы используете планировщики Heroku, вам не нужно больше рабочих из-за этого.Heroku будет самостоятельно заряжать свой час.

Вы уверены, что код выполнения отложенного задания не вызывает исключение?Если это так, задание будет снова поставлено в очередь в соответствии с переменной повтора (Delayed :: Worker.max_attempts), так что это может вызвать перепланирование.

...