จะเคลียร์งานทั้งหมดจาก Sidekiq ได้อย่างไร?


119

ฉันใช้ sidekiq สำหรับงานเบื้องหลังในแอปพลิเคชัน Rails ตอนนี้จำนวนงานมากขึ้นก็เลยอยากเคลียร์งานทั้งหมด ฉันลองคำสั่งต่อไปนี้ในคอนโซล

Sidekiq::Queue.new.clear

แต่มันให้ข้อผิดพลาดต่อไปนี้

NameError: uninitialized constant Sidekiq::Queue 

ฉันจะเคลียร์งานทั้งหมดจาก sidekiq ได้อย่างไร


ลองinclude 'sidekiq'ดูก่อน
เบญจ

@BenjaminSinclaire ให้ TypeError: สตริงอาร์กิวเมนต์ผิดประเภท (โมดูลที่คาดไว้)
Can

3
ลองrequire 'sidekiq'ดูก่อน
Uri Agassi

1
ฉันมักจะสับสน (จริงๆเสมอ) รวมและต้องการ :)
Benj

คำตอบ:



207

คุณสามารถทำได้ตามที่ระบุไว้ในปัญหา 1077หรือตามที่รายงานในบล็อกนี้ที่ noobsippets

ทั้งสองแนะนำให้เราทำสิ่งต่อไปนี้และสามารถทำได้บนคอนโซลราง:

Sidekiq.redis { |conn| conn.flushdb }


ดูเหมือนว่าจะรีเซ็ตการตรวจสอบสิทธิ์ของฉันในแอพ Rails ที่ฉันใช้ (ซึ่งหมายความว่าฉันต้องคัดลอกคุกกี้กลับไปที่ไคลเอนต์ HTTP ของฉัน) มีวิธีป้องกันไหม?
intcreator

1
สวัสดีคุณ Brandeamon คุณใช้ redis เพื่อควบคุมเซสชันของโครงการของคุณหรือไม่? เนื่องจากคำสั่งเหล่านี้ใช้เพื่อ "ล้าง" ข้อมูลทั้งหมดที่จัดเก็บใน redis จึงเทียบเท่ากับฐานข้อมูลแบบดร็อปหรือวางตารางในฐานข้อมูลเชิงสัมพันธ์
jonathanccalixto

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเมื่อพิจารณาจากคะแนนโหวต
M. Habib

สิ่งนี้ทำงานได้อย่างคาดเดาได้มากกว่าredis-cli flushdbว่าคุณกำลังเรียกใช้ redis บนเซิร์ฟเวอร์แยกต่างหากจากเซิร์ฟเวอร์รางของคุณ ฉันสงสัยว่าทำไมถึงใช้redis-cli flushdbไม่ได้จนกว่าฉันจะจำได้ว่าฉันต้องใส่อาร์กิวเมนต์ของโฮสต์และพอร์ต
maurice

4
ปัญหาของวิธีนี้คือถ้าคุณแชร์ redis / elasticache เดียวกันกับบริการต่างๆมันจะล้างข้อมูลอื่น ๆ ทั้งหมดใน redis db ด้วย
Charles Skariah

80

ล้างคำสั่งงาน Sidekiq:

require 'sidekiq/api'

# Clear retry set

Sidekiq::RetrySet.new.clear

# Clear scheduled jobs 

Sidekiq::ScheduledSet.new.clear

# Clear 'Dead' jobs statistics

Sidekiq::DeadSet.new.clear

# Clear 'Processed' and 'Failed' jobs statistics

Sidekiq::Stats.new.reset

# Clear specific queue

stats = Sidekiq::Stats.new
stats.queues
# => {"main_queue"=>25, "my_custom_queue"=>1}

queue = Sidekiq::Queue.new('my_custom_queue')
queue.count
queue.clear

3
นอกจากนี้คุณยังสามารถล้างคิวทั้งหมดด้วยSidekiq::Queue.all.map(&:clear)... มีประโยชน์เมื่อคุณซิงค์ฐานข้อมูลโลแคลกับ prod 😅
escanxr

36

จาก Sidekiq ล่าสุดเพียงแค่ระเบิดมัน:

require 'sidekiq/api'

q = Sidekiq::Queue.new
q.💣

ใช่คำสั่งเพื่อล้างทั้งหมดเป็นอีโมจิระเบิดจริงๆ ยังใช้ได้กับSidekiq::RetrySet.

หรือถ้าคุณไม่สนุกคุณสามารถใช้ q.clear


1
โอ้พระเจ้านี่มันอะไรกัน? @ ซาเวียร์มีเมธอดชื่อ. คุณช่วยแนะนำเอกสารเกี่ยวกับวิธีนี้ให้ฉันได้ไหม (💣)
codemilan

2
@codemilan ดูบล็อกโพสต์นี้: blog.honeybadger.io/…
Modus Tollens

ฉันได้invalid byte sequence in US-ASCII (ArgumentError)ดำเนินการq.💣: /
Shankar Thyagarajan

21
redis-cli flushdb

คุณยังสามารถใช้ redis-cli flushall


5
ปัญหาของวิธีนี้คือถ้าคุณแชร์ redis / elasticache เดียวกันกับบริการต่างๆมันจะล้างข้อมูลอื่น ๆ ทั้งหมดใน db ด้วย
Charles Skariah


10

งาน Sidekiq ทั้งหมดจะถูกบันทึกไว้ใน "Redis"

คุณสามารถทำความสะอาด "Redis" ได้ด้วยคำสั่งนี้

redis-cli flushall


1

หากคุณต้องการลบงานออกจากคิวเฉพาะให้ลอง:

queue = Sidekiq::Queue.new("default")
queue.each do |job|
  job.klass # => 'TestWorker'
  job.args # => ['easy']
  job.delete if job.jid == 'abcdef1234567890' || job.klass == 'TestWorker'
end

อ่านข้อมูลทั้งหมดเกี่ยวกับ sidekiq และคำสั่งคอนโซลที่สำคัญ - https://medium.com/@shashwat12june/all-you-need-to-know-about-sidekiq-a4b770a71f8f



0

ฉันรู้ว่าSidekiq.redis { |conn| conn.flushdb }ลบคีย์ทั้งหมดออกจากฐานข้อมูล redis มีวิธีที่ปลอดภัยกว่าในการล้างคิว sidekiq ทั้งหมดโดยใช้redis-cli:

redis-cli keys "*queue:*" | xargs redis-cli del

สามารถทำได้ด้วย Sidekiq API (ดูคำตอบของ Ravi Prakash Singh )

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