Existem comandos de console para verificar o que está na fila e limpar a fila no Sidekiq?


97

Estou acostumado a usar o método delayed_jobs para entrar no console para ver o que está na fila e a facilidade de limpar a fila quando necessário. Existem comandos semelhantes no Sidekiq para isso? Obrigado!


1
conforme mencionado por outros, a resposta selecionada abaixo está obsoleta.
emf

Respostas:


90

Eu nunca usei o Sidekiq, então é possível que existam métodos apenas para visualizar os trabalhos enfileirados, mas eles seriam apenas invólucros em torno dos comandos do Redis, já que basicamente tudo o que Sidekiq (e Resque) é:

# See workers
Sidekiq::Client.registered_workers

# See queues
Sidekiq::Client.registered_queues

# See all jobs for one queue
Sidekiq.redis { |r| r.lrange "queue:app_queue", 0, -1 }

# See all jobs in all queues
Sidekiq::Client.registered_queues.each do |q|
  Sidekiq.redis { |r| r.lrange "queue:#{q}", 0, -1 }
end

# Remove a queue and all of its jobs
Sidekiq.redis do |r| 
  r.srem "queues", "app_queue"
  r.del  "queue:app_queue"
end

Infelizmente, remover um trabalho específico é um pouco mais difícil, pois você teria que copiar seu valor exato:

# Remove a specific job from a queue
Sidekiq.redis { |r| r.lrem "queue:app_queue", -1, "the payload string stored in Redis" }

Você pode fazer tudo isso ainda mais facilmente via redis-cli:

$ redis-cli
> select 0 # (or whichever namespace Sidekiq is using)
> keys * # (just to get an idea of what you're working with)
> smembers queues
> lrange queues:app_queue 0 -1
> lrem queues:app_queue -1 "payload"

Você viu uma boa maneira de importar / migrar trabalhos agendados de reaplicação para o formato do sidekiq? Definir o namespace de sidekiq como 'resque' não parece pegar trabalhos agendados pelo que eu posso dizer. Obrigado!
Brian Armstrong

31
Algumas das soluções fornecidas aqui estão obsoletas.
Peter Wagenet

@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} funcionou para mim referenciando stackoverflow.com/questions/16009639/…
Paul

2
Como Wagenet apontou acima, esses exemplos estão desatualizados; como mkirk apontou abaixo, os documentos mais recentes com exemplos estão no wiki: github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues foi substituído por Sidekiq::Queue.alle Sidekiq::Client.registered_workerspor Sidekiq::Workers.new, consulte: github.com/mperham/sidekiq/blob/…
Martin Svoboda

136

Existe uma API ergonômica para visualização e gerenciamento de filas .

Não é obrigatório por padrão.

require 'sidekiq/api'

Aqui está o trecho:

# get a handle to the default queue
default_queue = Sidekiq::Queue.new 

# get a handle to the mailer queue
mailer_queue = Sidekiq::Queue.new("mailer") 

# How many jobs are in the default queue?
default_queue.size # => 1001

# How many jobs are in the mailer queue?
mailer_queue.size # => 50

#Deletes all Jobs in a Queue, by removing the queue.    
default_queue.clear

Você também pode obter algumas estatísticas resumidas.

stats = Sidekiq::Stats.new

# Get the number of jobs that have been processed.
stats.processed # => 100

# Get the number of jobs that have failed.    
stats.failed # => 3

# Get the queues with name and number enqueued.
stats.queues # => { "default" => 1001, "email" => 50 }

#Gets the number of jobs enqueued in all queues (does NOT include retries and scheduled jobs).
stats.enqueued # => 1051 

9
Esta é a abordagem que funciona agora (agosto de 2016). A resposta aceita está desatualizada em ~ 2013.
Jan Klimo

10

se houver algum trabalho agendado. Você pode excluir todos os trabalhos usando o seguinte comando:

Sidekiq::ScheduledSet.new.clear

se houver filas que você deseja excluir todos os trabalhos, você pode usar o seguinte comando:

  Sidekiq::Queue.new.clear

Trabalhos de novas tentativas também podem ser removidos pelo seguinte comando:

Sidekiq::RetrySet.new.clear

Há mais informações aqui no link a seguir, você pode conferir: https://github.com/mperham/sidekiq/wiki/API



2

Uma solução alternativa é usar o módulo de teste (requer 'sidekiq / testing') e drenar o trabalhador (MyWorker.drain).


2

Havia 'trabalhadores' enforcados na fila padrão e eu pude vê-los pela interface da web. Mas eles não estavam disponíveis no console se eu usasse Sidekiq :: Queue.new.size

irb(main):002:0> Sidekiq::Queue.new.size
2014-03-04T14:37:43Z 17256 TID-oujb9c974 INFO: Sidekiq client with redis options {:namespace=>"sidekiq_staging"}
=> 0

Usando redis-cli, consegui encontrá-los

redis 127.0.0.1:6379> keys *
    1) "sidekiq_staging:worker:ip-xxx-xxx-xxx-xxx:7635c39a29d7b255b564970bea51c026-69853672483440:default"
    2) "sidekiq_staging:worker:ip-xxx-xxx-xxx-xxx:0cf585f5e93e1850eee1ae4613a08e45-70328697677500:default:started"
    3) "sidekiq_staging:worker:ip-xxx-xxx-xxx-xxx:7635c39a29d7b255b564970bea51c026-69853672320140:default:started"
    ...

A solução foi:

irb(main):003:0>  Sidekiq.redis { |r| r.del "workers", 0, -1 }
=> 1

Também no Sidekiq v3 existe um comando

Sidekiq::Workers.new.prune

Mas por algum motivo não funcionou para mim naquele dia


2

E se você quiser limpar a fila de repetição do sidekiq, é este: Sidekiq::RetrySet.new.clear


2
$ redis-cli
> select 0 # (or whichever namespace Sidekiq is using)
> keys * # (just to get an idea of what you're working with)
> smembers queues
> lrange queue:queue_name 0 -1 # (queue_name must be your relevant queue)
> lrem queue:queue_name -1 "payload"

9
Nunca execute keys *em produção a menos que use esse redis apenas para sidekiq. Especialmente não execute se você tiver um grande conjunto de dados (cache, etc). O Redis é de thread único e keys *bloqueia - isso pode resultar em vários minutos de tempo de inatividade em grandes conjuntos de dados (vários Gbs).
timurb

1

Tarefa de rake para limpar todas as filas sidekiq:

namespace :sidekiq do
  desc 'Clear sidekiq queue'
  task clear: :environment do
    require 'sidekiq/api'
    Sidekiq::Queue.all.each(&:clear)
  end
end

Uso:

rake sidekiq:clear
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.