เคลียร์คิว sidekiq


93

ฉันเป็นคนงานที่ทำงานตลอดกาล

class Worker
  include Sidekiq::Worker
  sidekiq_options queue: "infinity", retry: true

  def perform(params)
    # ...
    self.class.perform_in(30.seconds, params)
  end
end

ปัญหาคือฉันโหลดคนงานเมื่อเริ่มต้นระบบเช่นนี้ config/initializers/load_workers.rb

Rails.application.config.after_initialize do  
  if ENV["SIDEKIQ"] == "1"
    Worker.perform_async({})
  end
end

ใช้นี้เพื่อเริ่มต้น SIDEKIQ=1 sidekiq --verbose --environment production -C config/sidekiq.ymlsidekiq

นั่นหมายความว่าคนงานเก่าจะหยุดทั้งคนที่กำลังทำงานอยู่ แต่คนที่ถูกเลื่อนเวลาไปด้วย

ฉันลองเรียกใช้สิ่งนี้เมื่อเริ่มต้น (ก่อนที่จะโหลดงานใหม่) แต่ไม่ได้ผล

q = []
q += Sidekiq::RetrySet.new.select { |job| job.klass.match(/Worker/) }
q += Sidekiq::Queue.new("infinity").select { |job| job.klass.match(/Worker/) }
q += Sidekiq::ScheduledSet.new.select { |job| job.klass.match(/Worker/) }
q.each(&:delete)

หลังจากปรับใช้ 5-ish จะมีคนงานที่ซ้ำกันจำนวนมากในคิวที่กำหนดไว้ในภายหลัง ดังนั้นมีวิธีล้างทุกอย่างในคิวเดียวและป้องกันไม่ให้งานที่รันอยู่แล้วจากการจัดตารางใหม่ได้หรือไม่?

ฉันใช้ sidekiq 3.0


คุณต้องการลบคิวหรืองานที่กำหนดเวลาไว้ หรือดีกว่าที่จะพูดว่างานที่กำหนดเวลาไว้ซ้ำกัน
Sabyasachi Ghosh

ฉันต้องการลบทุกร่องรอยของงานก่อนที่จะโหลดคนงานใหม่
Linus Oleander

ตกลงมีปัญหาของคุณ .. หมายความว่าคุณต้องการลบงานที่กำหนดเวลาไว้ทั้งหมด
Sabyasachi Ghosh

@haSabyasachiGhosh ไม่ฉันต้องการลบทุกอย่างที่เกี่ยวข้องกับคิวไม่ใช่แค่งานที่กำหนดไว้ กล่าวอีกนัยหนึ่ง; ควรลบงานที่ล้มเหลวต่อเนื่องอยู่ในคิวและกำหนดเวลาไว้
Linus Oleander

ความช่วยเหลือทั้งหมดอยู่ที่นี่ - github.com/mperham/sidekiq/wiki/API
viks

คำตอบ:


161

ลบงานทั้งหมดในคิวโดยการลบคิว

require 'sidekiq/api' # for the case of rails console

Sidekiq::Queue.new("infinity").clear
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear

อาจเป็นSidekiq Proจะช่วยคุณได้
Ranjithkumar Ravi

5
นี่คือการล้างเคาน์เตอร์Sidekiq::Stats.new.resetฉันพบว่าสิ่งนี้ช่วยได้

14
ในการล้างคิวเริ่มต้น / คิวแรก:Sidekiq::Queue.all.first.clear
user456584

1
Sidekiq :: Queue.new ("reports") clear and Sidekiq :: Queue.new ("alerts") clear ช่วยล้างคิวปัจจุบัน แต่เรื่อง Busy ล่ะ? ฉันจะเคลียร์งานที่ "ยุ่ง" ได้อย่างไร?
Donato

31
เคลียร์ให้หมดด้วยSidekiq::Queue.all.each &:clear
Marco Lazzeri

95

นี้ได้เคล็ดลับสำหรับฉัน:

Sidekiq::Queue.all.each(&:clear)
Sidekiq::RetrySet.new.clear
Sidekiq::ScheduledSet.new.clear
Sidekiq::DeadSet.new.clear

1
ขอบคุณสิ่งนี้ทำงานได้อย่างมีเสน่ห์ฉันตกอยู่ในภาวะฉุกเฉินฮ่าฮ่าเพื่อนสนิทอยู่กับ waaaaaay คนงานมากเกินไปในคิวสิ่งนี้ทำงานได้ตามที่ฉันคาดหวังไว้เนื่องจากฉันกำลังมองหาkillคำสั่ง like
d1jhoni1b

สมบูรณ์แบบเพียงแค่เพิ่มสิ่งนั้นใน env ของฉันฉันต้องใช้require 'sidekiq/api'คอนโซลเพื่อทำงาน
bonafernando

19

ใช้ได้กับฉันสำหรับเวอร์ชัน sidekiq ส่วนใหญ่:

Sidekiq::RetrySet.new.clear

Sidekiq::ScheduledSet.new.clear

ล้างสถิติ (ไม่บังคับ)

Sidekiq::Stats.new.reset

ซึ่งจะล้างฐานข้อมูลทั้งหมดไม่ใช่เฉพาะคิว
Linus Oleander

ถ้าจะล้างฐานข้อมูลทั้งหมดของ sidekiq และจะทำงานได้ดีในคอนโซลราง
vidur punj

-2

คุณสามารถล้างคิวของคุณได้โดยเรียกใช้รหัสนี้แม้ว่าจะมีวิธีการในตัวก็ตาม

queue = Sidekiq::Queue.new
queue.each do |job|
  job.delete 
end

สิ่งนี้ควรได้ผลเมื่อเราดึงงานทั้งหมดจากคิวแล้วลบทีละรายการ
Asad Hameed

ไม่มันไม่ ลองดูคำตอบที่มีอยู่ นอกจากนี้ยังซ้ำกับคำตอบที่มีอยู่
Linus Oleander

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