Limpar fila sidekiq

97

Tenho esse trabalhador que funciona para sempre.

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

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

O problema é que eu carrego trabalhadores na inicialização, assim. config/initializers/load_workers.rb

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

Usando isso para iniciar o sidekiq SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.yml.

Isso significa que os trabalhadores antigos devem parar, tanto os que estão em execução, mas também os que estão sendo reprogramados.

Tentei executar isso na inicialização (antes de carregar novos trabalhos), mas não funcionou.

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)

Após as implantações 5-ish, há um monte de trabalhadores duplicados na fila agendados para mais tarde. Portanto, há uma maneira de limpar tudo em uma fila e evitar que trabalhos já em execução sejam reprogramados?

Estou usando o sidekiq 3.0.

Linus Oleander
fonte
Você deseja excluir uma fila ou um trabalho agendado. ou melhor, trabalho agendado duplicado.
Sabyasachi Ghosh
Quero excluir todos os vestígios de um trabalho antes de carregar o novo trabalhador.
Linus Oleander de
ok, entendi seu problema ... significa que você deseja excluir todos os trabalhos agendados.
Sabyasachi Ghosh
@haSabyasachiGhosh Não, quero excluir tudo relacionado a uma fila, não apenas os trabalhos agendados. Em outras palavras; trabalhos com falha, em andamento, enfileirados e programados devem ser excluídos.
Linus Oleander de
Toda a ajuda está aqui - github.com/mperham/sidekiq/wiki/API
viks

Respostas:

162

Exclui todos os trabalhos em uma fila, removendo a fila.

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

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Ranjithkumar Ravi
fonte
Pode ser que o Sidekiq Pro o ajude.
Ranjithkumar Ravi
5
Aqui é para limpar os contadores Sidekiq::Stats.new.reset, descobri que isso ajuda
14
Para limpar a fila padrão / primeira:Sidekiq::Queue.all.first.clear
user456584
1
O Sidekiq :: Queue.new ("relatórios"). Clear e Sidekiq :: Queue.new ("alertas"). Clear ajudam a limpar a fila atual. Mas e quanto ao Busy? Como limpo as tarefas "Ocupadas"?
Donato
32
Elimine todos comSidekiq::Queue.all.each &:clear
Marco Lazzeri
101

Isso funcionou para mim:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear
iGEL
fonte
1
Obrigado, funcionou como um encanto, eu estava em uma emergência haha, o ajudante estava com waaaaaay muitos trabalhadores na fila isso funcionou como eu esperava, pois estava procurando por killum comando semelhante
d1jhoni1b
1
Perfeito, só adicionando isso no meu env eu precisava require 'sidekiq/api'no console para funcionar.
bonafernando
19

Funciona para mim para a maioria das versões sidekiq:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

Limpar estatísticas (opcional)

Sidekiq::Stats.new.reset
rusllonrails
fonte
Isso libera todo o banco de dados, não apenas a fila.
Linus Oleander
se irá limpar todo o banco de dados do sidekiq e funcionará bem no console do Rails
vidur punj
-2

Você pode limpar sua fila executando este código, embora haja métodos embutidos.

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end
Asad Hameed
fonte
Bem, isso deve funcionar, pois buscamos todos os trabalhos da fila e, em seguida, os excluímos um por um.
Asad Hameed
Não, não faz. Dê uma olhada nas respostas existentes. Também é uma duplicata da resposta existente.
Linus Oleander,
Eu não sei do que você está falando. Você pode me mostrar a mesma resposta que postei?
Asad Hameed