Como limpar todos os trabalhos de sidekiq?

118

Estou usando o sidekiq para tarefas em segundo plano no aplicativo Rails. Agora o número de empregos aumenta, então quero eliminar todos os empregos. Eu tentei o seguinte comando no console

Sidekiq::Queue.new.clear

mas estava dando o seguinte erro.

NameError: uninitialized constant Sidekiq::Queue 

Como faço para limpar todos os trabalhos do sidekiq?

Pode, pode
fonte
tentar include 'sidekiq'antes
Benj
@BenjaminSinclaire está dando TypeError: tipo de argumento incorreto String (módulo esperado)
Can Can
3
tente require 'sidekiq'antes
Uri Agassi
1
Eu sempre (realmente sempre) confundo incluir e exigir :)
Benj

Respostas:

206

Você pode fazer o que está escrito na questão 1077 ou conforme relatado neste blog em noobsippets

Ambos sugerem que façamos o seguinte, e pode ser feito no console do trilho:

Sidekiq.redis { |conn| conn.flushdb }

Jonathanccalixto
fonte
Isso parece redefinir minha autenticação nos aplicativos Rails que estou usando (o que significa que tenho que copiar os cookies de volta para o meu cliente HTTP). Existe uma maneira de evitar isso?
intcreator
1
Olá, Brandeamon. Você está usando o redis para controlar a sessão do seu projeto? Como esses comandos são para "limpar" todos os dados armazenados no redis, é equivalente a eliminar um banco de dados ou eliminar uma tabela em bancos de dados relacionais.
jonathanccalixto de
1
Esta deve ser a resposta aceita considerando seus votos.
M. Habib
Isso funciona de forma mais previsível do que redis-cli flushdbse você estiver executando o redis em um servidor separado do servidor Rails. Fiquei me perguntando por redis-cli flushdbque não funcionou até que lembrei que precisava incluir argumentos de host e porta.
maurício
4
O problema com essa abordagem é que, se você estiver compartilhando o mesmo redis / elasticache em serviços diferentes, todos os outros dados do redis db serão limpos também.
Charles Skariah
80

Comandos Clear Sidekiq Jobs:

require 'sidekiq/api'

# Clear retry set

Sidekiq::RetrySet.new.clear

# Clear scheduled jobs 

Sidekiq::ScheduledSet.new.clear

# Clear 'Dead' jobs statistics

Sidekiq::DeadSet.new.clear

# Clear 'Processed' and 'Failed' jobs statistics

Sidekiq::Stats.new.reset

# Clear specific queue

stats = Sidekiq::Stats.new
stats.queues
# => {"main_queue"=>25, "my_custom_queue"=>1}

queue = Sidekiq::Queue.new('my_custom_queue')
queue.count
queue.clear
rusllonrails
fonte
3
Você também pode limpar todas as filas com Sidekiq::Queue.all.map(&:clear)... Útil quando você sincroniza seu banco de dados local com o prod 😅
escanxr 01 de
36

No último Sidekiq, basta explodi-lo:

require 'sidekiq/api'

q = Sidekiq::Queue.new
q.💣

Sim, o comando para limpar tudo é literalmente um emoji de bomba. Também funciona paraSidekiq::RetrySet .

Ou se você não é divertido, pode usar q.clear

Xavier
fonte
1
OMG, o que diabos é isso? @Xavier, existe um método chamado .💣, você pode me orientar no documento sobre este método (💣).
codemilan
2
@codemilan Veja esta postagem do blog: blog.honeybadger.io/…
Modus Tollens
Eu comecei invalid byte sequence in US-ASCII (ArgumentError)a executar q.💣: /
Shankar Thyagarajan
21
redis-cli flushdb

Você também pode usar redis-cli flushall

Sai Ram Reddy
fonte
5
O problema com essa abordagem é se você estiver compartilhando o mesmo redis / elasticache em serviços diferentes, todos os outros dados no banco de dados também serão apagados.
Charles Skariah
13

Use Rails runner em uma linha

rails runner 'Sidekiq.redis { |conn| conn.flushdb }'
fangxing
fonte
10

Todas as tarefas do Sidekiq são salvas no "Redis".

Você pode limpar o "Redis" com este comando

redis-cli flushall
Andriy Kondzolko
fonte
8

Você pode usar isso para limpar todos os trabalhos

require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Ravi Prakash Singh
fonte
1
require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Nicolás Schmidt Gubbins
fonte
Esta resposta é uma duplicata de stackoverflow.com/a/56488682/3676469
Hirurg103
0

Percebi que Sidekiq.redis { |conn| conn.flushdb }remove todas as chaves do banco de dados redis. Há uma maneira mais segura de limpar todas as filas sidekiq usando redis-cli:

redis-cli keys "*queue:*" | xargs redis-cli del

O mesmo pode ser alcançado com a API Sidekiq (veja a resposta de Ravi Prakash Singh )

Hirurg103
fonte