我在我的应用程序中使用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次。我在这里缺少任何东西吗?
如何在本地重写写重试限制和重试延迟?
答案 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)