Очистить очередь sidekiq

93

У меня есть этот рабочий, который бежит вечно.

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

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end

Проблема в том, что я загружаю воркеров при запуске, вот так. config/initializers/load_workers.rb

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

Используя это, чтобы запустить 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)

После пятикратного развертывания в очереди, запланированной на более позднее время, появляется куча повторяющихся рабочих процессов. Итак, есть ли способ очистить все в одной очереди и предотвратить перепланирование уже запущенных заданий?

Я использую sidekiq 3.0.

Линус Олеандр
источник
Вы хотите удалить очередь или запланированное задание. или лучше сказать повторяющееся запланированное задание.
Sabyasachi Ghosh
Я хочу удалить все следы задания перед загрузкой нового рабочего.
Линус Олеандр
хорошо, у вас проблема .. означает, что вы хотите удалить все запланированные задания.
Sabyasachi Ghosh
@haSabyasachiGhosh Нет, я хочу удалить все, что связано с очередью, а не только запланированные задания. Другими словами; неудачные, текущие, поставленные в очередь и запланированные задания должны быть удалены.
Линус Олеандр
Вся помощь здесь - github.com/mperham/sidekiq/wiki/API
viks

Ответы:

161

Удаляет все задания в очереди, удаляя очередь.

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

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Ранджиткумар Рави
источник
Может быть Sidekiq Pro поможет вам.
Ранджиткумар Рави
5
Чтобы очистить счетчики, Sidekiq::Stats.new.resetя выяснил, что это помогает
14
Чтобы очистить очередь по умолчанию / первую очередь:Sidekiq::Queue.all.first.clear
user456584
1
Sidekiq :: Queue.new («отчеты»). Clear и Sidekiq :: Queue.new («предупреждения»). Clear помогает очистить текущую очередь. Но как насчет занятости? Как убрать «Занятые» задания?
Донато
31
Sidekiq::Queue.all.each &:clear
Очисти
95

Это помогло мне:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
источник
1
Спасибо, это сработало как шарм, я попал в чрезвычайную ситуацию, ха-ха, помощник был с waaaaaay, слишком много рабочих в очереди, это сработало, как я ожидал, так как я искал killподобную команду
d1jhoni1b
Отлично, просто добавив, что в моем env мне пришлось require 'sidekiq/api'работать на консоли.
bonafernando
19

У меня работает для большинства версий sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Очистить статистику (необязательно)

Sidekiq::Stats.new.reset
Rusllonrails
источник
Это очищает всю базу данных, а не только очередь.
Линус Олеандр
if очистит всю базу данных sidekiq и будет нормально работать в консоли rails
vidur punj
-2

Вы можете очистить свою очередь, запустив этот код, хотя там будут встроенные методы.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Асад Хамид
источник
Что ж, это должно работать, поскольку мы извлекли все задания из очереди, а затем удалили их одно за другим.
Асад Хамид
Нет, это не так. Взгляните на существующие ответы. Это также дубликат существующего ответа.
Линус Олеандр
Я не понимаю, о чем ты говоришь. Не могли бы вы показать мне тот же ответ, что и я?
Асад Хамид