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!


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"

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 

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



2

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


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


2

Dan jika Anda ingin menghapus antrian coba ulang sidekiq, ini adalah: 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
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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.