清除sidekiq队列

Lin*_*der 73 ruby-on-rails sidekiq

我是这个永远奔跑的工人.

class Worker
  include Sidekiq::Worker
  sidekiq_options queue: "infinity", retry: true

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end
Run Code Online (Sandbox Code Playgroud)

问题是我在启动时加载工人,就像这样. config/initializers/load_workers.rb

Rails.application.config.after_initialize do  
  if ENV["SIDEKIQ"] == "1"
    Worker.perform_async({})
  end
end
Run Code Online (Sandbox Code Playgroud)

用这个来启动sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

这意味着老工人要停下来,既有目前正在运行的人,也有被重新安排的人.

我尝试在启动时运行它(在加载新工作之前),但这不起作用.

q = []
q += Sidekiq::RetrySet.new.select { |job| job.klass.match(/Worker/) }
q += Sidekiq::Queue.new("infinity").select { |job| job.klass.match(/Worker/) }
q += Sidekiq::ScheduledSet.new.select { |job| job.klass.match(/Worker/) }
q.each(&:delete)
Run Code Online (Sandbox Code Playgroud)

在5-ish部署之后,队列中有大量重复的工作程序安排在稍后.那么,有没有办法清除一个队列中的每一个并阻止已经重新安排的作业?

我正在使用sidekiq 3.0.

Ran*_*avi 134

删除队列,删除队列中的所有作业.

require 'sidekiq/api' # for the case of rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Run Code Online (Sandbox Code Playgroud)

  • 用`Sidekiq :: Queue.all.each&:clear`清除它们 (25认同)
  • 要清除默认/第一个队列:`Sidekiq :: Queue.all.first.clear` (14认同)
  • 这是清除计数器`Sidekiq :: Stats.new.reset`我发现这有助于解决问题 (5认同)
  • 这不会停止/删除已经运行的作业. (4认同)
  • Sidekiq::Queue.new("reports").clear 和 Sidekiq::Queue.new("alerts").clear 有助于清除当前队列。但是忙呢?如何清除“忙碌”作业? (2认同)

iGE*_*GEL 56

这对我有用:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
Run Code Online (Sandbox Code Playgroud)


rus*_*ils 17

适用于大多数sidekiq版本:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear
Run Code Online (Sandbox Code Playgroud)

清除统计数据(可选)

Sidekiq::Stats.new.reset
Run Code Online (Sandbox Code Playgroud)