มีคำสั่งคอนโซลเพื่อดูสิ่งที่อยู่ในคิวและเพื่อล้างคิวใน Sidekiq หรือไม่?


97

ฉันคุ้นเคยกับการใช้วิธี delay_jobs ในการเข้าไปในคอนโซลเพื่อดูว่ามีอะไรอยู่ในคิวและความสะดวกในการล้างคิวเมื่อจำเป็น มีคำสั่งที่คล้ายกันใน Sidekiq สำหรับสิ่งนี้หรือไม่? ขอบคุณ!


1
ดังที่ผู้อื่นกล่าวไว้คำตอบที่เลือกด้านล่างนี้เลิกใช้แล้ว
emf

คำตอบ:


90

ฉันไม่เคยใช้ Sidekiq มาก่อนดังนั้นจึงเป็นไปได้ว่ามีวิธีการสำหรับการดูงานที่อยู่ในคิวเท่านั้น แต่จริงๆแล้วพวกเขาจะเป็นเพียงห่อหุ้มคำสั่ง Redis เนื่องจากโดยทั่วไปแล้ว Sidekiq (และ 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

น่าเสียดายที่การลบงานเฉพาะออกนั้นยากกว่าเล็กน้อยเนื่องจากคุณต้องคัดลอกค่าที่แน่นอน:

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

คุณสามารถทำทั้งหมดนี้ได้ง่ายขึ้นผ่าน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"

คุณเคยเห็นวิธีที่ดีในการนำเข้า / โยกย้ายงานที่กำหนดเวลา resque เป็นรูปแบบของ sidekiq หรือไม่? การตั้งค่าเนมสเปซของ sidekiq เป็น 'resque' ดูเหมือนจะไม่ได้รับงานตามกำหนดเวลาจากสิ่งที่ฉันบอกได้ ขอบคุณ!
Brian Armstrong

32
โซลูชันบางส่วนที่มีให้ที่นี่ถูกเลิกใช้แล้ว
Peter Wagenet

@BrianArmstrong Sidekiq.redis {| r | r.zrange ("schedule", 0, -1, {withscores: true})} ทำงานให้ฉันโดยอ้างถึงstackoverflow.com/questions/16009639/…
พอล

2
ดังที่ Wagenet ได้กล่าวไว้ข้างต้นตัวอย่างเหล่านี้ล้าสมัย ตามที่ mkirk ระบุไว้ด้านล่างเอกสารล่าสุดพร้อมตัวอย่างอยู่ใน wiki: github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues ถูกแทนที่ด้วยSidekiq::Queue.allและSidekiq::Client.registered_workersด้วยSidekiq::Workers.newดู: github.com/mperham/sidekiq/blob/…
Martin Svoboda

136

มีความเหมาะกับการทำงานเป็นAPI สำหรับการดูและการจัดการคิว

โดยค่าเริ่มต้นไม่จำเป็น

require 'sidekiq/api'

นี่คือข้อความที่ตัดตอนมา:

# 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

คุณยังสามารถรับสถิติสรุปได้อีกด้วย

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
นี่คือแนวทางที่ใช้ได้ผลในขณะนี้ (สิงหาคม 2559) คำตอบที่ยอมรับนั้นล้าสมัยเมื่อ ~ 2013
ม.ค. Klimo

10

หากมีงานตามกำหนดเวลา คุณสามารถลบงานทั้งหมดโดยใช้คำสั่งต่อไปนี้:

Sidekiq::ScheduledSet.new.clear

หากมีคิวที่คุณต้องการลบงานทั้งหมดคุณสามารถใช้คำสั่งต่อไปนี้:

  Sidekiq::Queue.new.clear

Retries งานสามารถลบออกได้ด้วยคำสั่งต่อไปนี้:

Sidekiq::RetrySet.new.clear

มีข้อมูลเพิ่มเติมที่ลิงค์ต่อไปนี้คุณสามารถชำระเงิน: https://github.com/mperham/sidekiq/wiki/API




2

มี 'คนงาน' ถูกแขวนคอในคิวเริ่มต้นและฉันสามารถเห็นพวกเขาผ่านทางเว็บอินเตอร์เฟส แต่ไม่สามารถใช้งานได้จากคอนโซลถ้าฉันใช้ 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

การใช้ redis-cli ฉันสามารถค้นหาได้

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

วิธีแก้ปัญหาคือ:

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

นอกจากนี้ใน Sidekiq v3 ยังมีคำสั่ง

Sidekiq::Workers.new.prune

แต่ด้วยเหตุผลบางอย่างมันไม่ได้ผลสำหรับฉันในวันนั้น


2

และถ้าคุณต้องการล้างคิวการลองใหม่ sidekiq ให้ทำดังนี้: 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 *การผลิตเว้นแต่คุณจะใช้ redis นั้นสำหรับ sidekiq เท่านั้น โดยเฉพาะอย่าเรียกใช้ถ้าคุณมีชุดข้อมูลขนาดใหญ่ (แคช ฯลฯ ) Redis เป็นเธรดเดียวและkeys *บล็อกซึ่งอาจส่งผลให้มีการหยุดทำงานหลายนาทีในชุดข้อมูลขนาดใหญ่ (หลาย Gbs)
จับเวลา

1

งานคราดเพื่อล้างคิว sidekiq ทั้งหมด:

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

การใช้งาน:

rake sidekiq:clear
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.