如何使用ActiveJob设置Sidekiq的重试次数?

sch*_*cho 19 sidekiq rails-activejob

从Rails API,我发现ActiveJob可以retry_job间隔:

my_job_instance.enqueue
my_job_instance.enqueue wait: 5.minutes
my_job_instance.enqueue queue: :important
my_job_instance.enqueue wait_until: Date.tomorrow.midnight
Run Code Online (Sandbox Code Playgroud)

http://api.rubyonrails.org/classes/ActiveJob/Enqueuing.html

但是如果我想设置重试计数,比如Sidekiq:

include Sidekiq::Worker
sidekiq_options :retry => 5
Run Code Online (Sandbox Code Playgroud)

https://github.com/mperham/sidekiq/wiki/Error-Handling

该示例代码怎么办?

class SiteScrapperJob < ActiveJob::Base
  rescue_from(ErrorLoadingSite) do
    retry_job queue: :low_priority
  end

  def perform(*args)
    # raise ErrorLoadingSite if cannot scrape
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我把它添加到我的工作班:

Sidekiq.default_worker_options = { retry: 5 }
Run Code Online (Sandbox Code Playgroud)

但似乎不是很好.

Vin*_*ira 18

您也可能对此解决方案感兴趣,该解决方案使用serializedeserializeapi来存储尝试次数.

class DeliverWebhookJob < ActiveJob::Base
  def serialize
    super.merge('attempt_number' => (@attempt_number || 0) + 1)
  end

  def deserialize(job_data)
    super
    @attempt_number = job_data['attempt_number']
  end

  rescue_from(ErrorLoadingSite) do |exception|
    retry_job(wait: 10) if @attempt_number < 5
  end

  def perform(*args)
    # raise ErrorLoadingSite if cannot scrape
  end
end
Run Code Online (Sandbox Code Playgroud)

这里拿走它.


hat*_*a91 14

从Rails 5.1开始,有一种使用retry_on方法执行此操作的内置方法.它是一个通用的ActiveJob方法,因此它可以与任何排队后端一起使用,而不仅仅是Sidekiq.

例如,对于您的具体工作,您可以:

class SiteScraperJob < ActiveJob::Base
  retry_on ErrorLoadingSite, queue: :low_priority, attempts: 5

  def perform(*args)
    # raise ErrorLoadingSite if cannot scrape
  end
end
Run Code Online (Sandbox Code Playgroud)

您还可以设置常量等待间隔或指数等待策略,如文档中所述.


Mik*_*ham 13

你不能.如果您想使用Sidekiq特定的东西,您需要使用Sidekiq特定的API.ActiveJob不会暴露Sidekiq的重试机制.

  • 方法`sidekiq_options`中的一个! (2认同)

Nun*_*sta 2

请参阅此处Sidekiq 的默认设置。该属性retry“接受”布尔值,而不是您假设的数字。

从将 active_job 合并到 Rails 的另一个文件中,我们可以看到它再次retry不接受重试次数。

文档中所说的是,对于每个作业,您可以定义该作业是否重试。

我还尝试查找该config/sidekiq.yml文件是否可以接收该号码,但似乎不能。

最后,

如果您在 25 次重试(大约 21 天)内没有修复错误,Sidekiq 将停止重试并将您的作业移至“死作业队列”。您可以在接下来的 6 个月内随时使用 Web UI 修复错误并手动重试作业。