Kuyrukta ne olduğuna bakmak ve Sidekiq'teki kuyruğu temizlemek için konsol komutları var mı?


97

Kuyrukta ne olduğunu görmek için konsola girmek için delayed_jobs yöntemini ve gerektiğinde kuyruğu temizleme kolaylığını kullanmaya alıştım. Sidekiq'te bunun için benzer komutlar var mı? Teşekkürler!


1
Başkaları tarafından da belirtildiği gibi, aşağıda seçilen yanıt kullanımdan kaldırılmıştır.
emf

Yanıtlar:


90

Sidekiq'i daha önce hiç kullanmadım, bu yüzden sadece sıraya alınmış işleri görüntülemek için yöntemler olabilir, ancak bunlar aslında Redis komutlarının etrafına sarmalayıcılar olabilirdi, çünkü temelde hepsi Sidekiq (ve Resque) budur:

# 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

Ne yazık ki, belirli bir işi kaldırmak, tam değerini kopyalamanız gerekeceğinden biraz daha zordur:

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

Tüm bunları şu yollarla daha da kolay bir şekilde yapabilirsiniz 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"

Yeniden sıraya koyma programlı işleri sidekiq formatına aktarmanın / taşımanın iyi bir yolunu gördünüz mü? Sidekiq'in ad alanını 'yeniden sıralamak' olarak ayarlamak, benim söyleyebildiklerimden planlanmış işleri almıyor gibi görünüyor. Teşekkürler!
Brian Armstrong

31
Burada sağlanan çözümlerden bazıları kullanımdan kaldırılmıştır.
Peter Wagenet

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

2
Wagenet'in yukarıda işaret ettiği gibi, bu örneklerin modası geçmiştir; mkirk'in aşağıda işaret ettiği gibi, örneklerle birlikte en son dokümanlar wiki'de
odigity

1
Sidekiq::Client.registered_queues ile Sidekiq::Queue.allve Sidekiq::Client.registered_workersile değiştirilmiştir Sidekiq::Workers.new, bakınız: github.com/mperham/sidekiq/blob/…
Martin Svoboda

136

Kuyrukları görüntülemek ve yönetmek için ergonomik bir API vardır .

Varsayılan olarak gerekli değildir.

require 'sidekiq/api'

İşte alıntı:

# 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

Ayrıca bazı özet istatistikleri de alabilirsiniz.

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
Şu anda işe yarayan yaklaşım budur (Ağustos 2016). Kabul edilen yanıt, ~ 2013 itibariyle güncelliğini yitirmiştir.
Jan Klimo

10

planlanmış herhangi bir iş varsa. Aşağıdaki komutu kullanarak tüm işleri silebilirsiniz:

Sidekiq::ScheduledSet.new.clear

Tüm işleri silmek istediğiniz herhangi bir kuyruk varsa, aşağıdaki komutu kullanabilirsiniz:

  Sidekiq::Queue.new.clear

Yeniden Denemeler İşler aşağıdaki komutla da kaldırılabilir:

Sidekiq::RetrySet.new.clear

Aşağıdaki bağlantıda daha fazla bilgi var, kontrol edebilirsiniz: https://github.com/mperham/sidekiq/wiki/API



2

Çözüm, test modülünü kullanmak ('sidekiq / test' gerektirir) ve çalışanı boşaltmaktır (MyWorker.drain).


2

Varsayılan sırada asılmış 'işçiler' vardı ve onları web arayüzünden görebiliyordum. Ancak Sidekiq :: Queue.new.size kullandıysam konsoldan kullanılamazlardı

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

Redis-cli kullanarak onları bulabildim

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"
    ...

Çözüm şuydu:

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

Ayrıca Sidekiq v3'te bir komut var

Sidekiq::Workers.new.prune

Ama nedense o gün benim için işe yaramadı


2

Ve sidekiq yeniden deneme kuyruğunu temizlemek istiyorsanız, bu: 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
keys *Bu redis'i yalnızca sidekiq için kullanmadığınız sürece asla üretime geçmeyin. Özellikle büyük veri kümeniz varsa (önbellek vb.) Çalıştırmayın. Redis tek iş parçacıklıdır ve keys *bloklar - bu, büyük veri kümelerinde (birkaç Gbs) birkaç dakikalık kesinti süresine neden olabilir.
timurb

1

Tüm sidekiq kuyruklarını temizlemek için görev:

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

Kullanım:

rake sidekiq:clear
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.