Apakah ada perintah konsol untuk melihat apa yang ada di antrian dan untuk menghapus antrian di Sidekiq?

97

Saya terbiasa menggunakan metode delay_jobs untuk masuk ke konsol untuk melihat apa yang ada di antrian, dan kemudahan membersihkan antrian saat diperlukan. Apakah ada perintah serupa di Sidekiq untuk ini? Terima kasih!

ketekunan
sumber
1
seperti yang disebutkan oleh orang lain, jawaban yang dipilih di bawah ini sudah usang.
ggl

Jawaban:

90

Saya belum pernah menggunakan Sidekiq, jadi mungkin ada metode hanya untuk melihat pekerjaan yang diantrekan, tetapi mereka benar-benar hanya menjadi pembungkus di sekitar perintah Redis, karena pada dasarnya semua Sidekiq (dan Resque) adalah:

# 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

Sayangnya, menghapus pekerjaan tertentu sedikit lebih sulit karena Anda harus menyalin nilai tepatnya:

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

Anda dapat melakukan semua ini dengan lebih mudah melalui 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"
tukang batu
sumber
Pernahkah Anda melihat cara yang baik untuk mengimpor / memindahkan pekerjaan terjadwal ulang ke format sidekiq? Mengatur namespace sidekiq menjadi 'resque' sepertinya tidak mengambil pekerjaan yang dijadwalkan dari apa yang saya tahu. Terima kasih!
Brian Armstrong
31
Beberapa solusi yang disediakan di sini tidak berlaku lagi.
Peter Wagenet
@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} bekerja untuk saya merujuk stackoverflow.com/questions/16009639/…
Paul
2
Seperti yang ditunjukkan Wagenet di atas, contoh-contoh ini sudah ketinggalan zaman; seperti yang ditunjukkan mkirk di bawah ini, dokumen terbaru dengan contoh ada di wiki: github.com/mperham/sidekiq/wiki/API
odigity
1
Sidekiq::Client.registered_queues telah diganti dengan Sidekiq::Queue.alldan Sidekiq::Client.registered_workersdengan Sidekiq::Workers.new, lihat: github.com/mperham/sidekiq/blob/…
Martin Svoboda
136

Ada API ergonomis untuk melihat dan mengatur antrian .

Ini tidak diperlukan secara default.

require 'sidekiq/api'

Berikut kutipannya:

# 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

Anda juga bisa mendapatkan beberapa statistik ringkasan.

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 
mkirk
sumber
9
Ini adalah pendekatan yang berhasil saat ini (Agustus 2016). Jawaban yang diterima sudah usang mulai ~ 2013.
Jan Klimo
10

jika ada pekerjaan terjadwal. Anda dapat menghapus semua pekerjaan menggunakan perintah berikut:

Sidekiq::ScheduledSet.new.clear

jika ada antrian yang ingin Anda hapus semua pekerjaan, Anda dapat menggunakan perintah berikut:

  Sidekiq::Queue.new.clear

Mencoba Lagi Pekerjaan juga dapat dihapus dengan perintah berikut:

Sidekiq::RetrySet.new.clear

Ada informasi lebih lanjut di sini di tautan berikut, Anda dapat melakukan pembayaran: https://github.com/mperham/sidekiq/wiki/API

Rubyrider
sumber
2

Solusinya adalah dengan menggunakan modul pengujian (memerlukan 'sidekiq / pengujian') dan menguras pekerja (MyWorker.drain).

chikamichi
sumber
2

Ada 'pekerja' yang digantung dalam antrean default dan saya dapat melihatnya melalui antarmuka web. Tetapi mereka tidak tersedia dari konsol jika saya menggunakan 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

Dengan menggunakan redis-cli, saya dapat menemukannya

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

Solusinya adalah:

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

Juga di Sidekiq v3 ada perintah

Sidekiq::Workers.new.prune

Tetapi untuk beberapa alasan itu tidak berhasil untuk saya hari itu

Ivan Linko
sumber
2

Dan jika Anda ingin menghapus antrian coba ulang sidekiq, ini adalah: Sidekiq::RetrySet.new.clear

courtimas
sumber
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"
Prashant Vithani
sumber
9
Jangan pernah menjalankan keys *produksi kecuali Anda menggunakan redis itu hanya untuk sidekiq. Terutama jangan menjalankannya jika Anda memiliki dataset besar (cache, dll). Redis adalah single-threaded dan keys *blok - ini dapat mengakibatkan beberapa menit downtime pada kumpulan data besar (beberapa Gbs).
timurb
1

Rake tugas untuk menghapus semua antrian sidekiq:

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

Pemakaian:

rake sidekiq:clear
Sisi gelap
sumber