为backburner中的不同作业指定不同的重试限制和重试延迟

时间:2015-07-14 06:54:12

标签: ruby-on-rails activerecord

我在我的应用程序中使用beaneater / beanstalk来维护作业队列。 https://github.com/nesquena/backburner

我的backburner全局配置文件看起来像 -

Backburner.configure do |config|
  config.beanstalk_url    = ["beanstalk://#{CONFIG['beanstalk']['host']}:#{CONFIG['beanstalk']['port']}"]
  config.tube_namespace   = CONFIG['beanstalk']['tube_name']
  config.on_error         = lambda { |e| puts e }
  config.max_job_retries  = 5 # default 0 retries
  config.retry_delay      = 30 # default 5 seconds
  config.default_priority = 65536
  config.respond_timeout  = 120
  config.default_worker   = Backburner::Workers::Simple
  config.logger           = Logger.new('log/backburner.log')
  config.priority_labels  = { :custom => 50, :useless => 1000 }
  config.reserve_timeout  = nil
end

我想为不同的作业设置不同的重试限制和重试延迟。 我正在寻找rubydoc以获得相应的变量/函数。 As per this rubydoc link,我尝试在worker中本地配置retry_limit:

一个特定的工人看起来像 -

class AbcJob
  include Backburner::Queue
  queue "abc_job"  # defaults to 'backburner-jobs' tube
  queue_priority 10 # most urgent priority is 0
  queue_respond_timeout 300 # number of seconds before job times out
  queue_retry_limit 2

  def self.perform(abc_id)
    .....Task to be done.....
  end
end

然而,它仍然从全局配置文件中获取重试限制并重试5次而不是2次。我在这里缺少任何东西吗?

如何在本地重写写重试限制和重试延迟?

1 个答案:

答案 0 :(得分:1)

我找不到正确的方法,但我找到了解决方案。 我将perform的整个身体放在开始救援区块中,如果失败,我会使用自定义延迟重新启动它。另外,为了保持重试次数的轨迹,我把它作为一个我要入队的论据。

class AbcJob
include Backburner::Queue
queue "abc_job"  # defaults to 'backburner-jobs' tube
queue_priority 10 # most urgent priority is 0
queue_respond_timeout 300 # number of seconds before job times out

def self.perform(abc_id, attempt = 1)
  begin
    .....Task to be done.....
  rescue StandardError => e
    # Any notification method so that you can know about failure reason and fix it before next retry
    # I am using NotificationMailer with e.message as body to debug
    # Any function you want your retry delay to be, I am using quadratic
    delay = attempt * attempt
    if attempt + 1 < GlobalConstant::MaxRetryCount
      Backburner::Worker.enqueue(AbcJob, [abc_id, attempt + 1], delay: delay.minute)
    else
      raise # if you want your jobs to be buried eventually
    end
  end
end

我将try的默认值保持为1,以便魔术nuber 1不出现在代码中,这可能会引发我们为什么传递常量的问题。要从代码中的其他位置入队,您可以使用简单的入队

Backburner::Worker.enqueue(AbcJob, abc_id)
相关问题