You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Sidekiq是否支持像ActiveJob一样将重试任务放入独立队列?

Sidekiq 重试任务切换队列实现方案

原生 Sidekiq 直接支持将重试任务放入指定队列执行,无需手动捕获异常创建新任务,可通过以下两种方案实现:

单任务级配置(仅对指定 Worker 生效)

在对应 Worker 类中使用 sidekiq_retry_in 钩子,修改任务的队列属性即可:

class CustomWorker
  include Sidekiq::Worker
  # 初始默认队列是 default,最多重试5次
  sidekiq_options retry: 5, queue: 'default'

  sidekiq_retry_in do |count, exception, job|
    # 所有重试任务自动切换到 failed_retry 队列
    job['queue'] = 'failed_retry'
    # 可自定义重试间隔,返回值为秒数,示例为指数退避逻辑
    (count ** 4) + 15
  end

  def perform(*args)
    # 业务逻辑
  end
end

该方案逻辑全部收敛在 Worker 内部,不需要额外全局配置,符合简洁透明的需求。

全局统一配置(对所有 Worker 生效)

如果需要所有重试任务都统一进入指定队列,可在 Sidekiq 初始化配置中添加全局规则:

# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.server_middleware do |chain|
    chain.modify Sidekiq::Middleware::Server::RetryJobs, retry_in: lambda { |count, exception, job|
      job['queue'] = 'global_retry'
      (count ** 4) + 15
    }
  end
end

注意事项

  • 需提前在 Sidekiq 启动配置中添加你指定的重试队列,确保 Sidekiq 进程会消费该队列:
    命令行启动示例:sidekiq -q default -q failed_retry -q global_retry
    也可直接在 config/sidekiq.yml 中配置队列列表和优先级。
  • 若需要将最终重试耗尽的任务单独放到死信队列方便后续排查,可增加 sidekiq_retries_exhausted 钩子:
    sidekiq_retries_exhausted do |job_msg, exception|
      Sidekiq::Client.push(
        queue: 'dead_letter',
        class: CustomWorker,
        args: job_msg['args']
      )
    end
    

内容的提问来源于stack exchange,提问作者Bohdan Biloshytskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:18:02