Có các lệnh bảng điều khiển để xem những gì trong hàng đợi và để xóa hàng đợi trong Sidekiq?


97

Tôi đã quen với việc sử dụng phương thức delay_jobs để vào bảng điều khiển để xem có gì trong hàng đợi và dễ dàng xóa hàng đợi khi cần. Có các lệnh tương tự trong Sidekiq cho việc này không? Cảm ơn!


1
như những người khác đã đề cập, câu trả lời được chọn bên dưới không được dùng nữa.
emf

Câu trả lời:


90

Tôi chưa bao giờ sử dụng Sidekiq, vì vậy có thể có các phương pháp chỉ để xem các công việc được xếp hàng đợi, nhưng chúng thực sự sẽ chỉ là trình bao bọc xung quanh các lệnh của Redis, vì về cơ bản tất cả Sidekiq (và Resque) là:

# 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

Thật không may, việc loại bỏ một công việc cụ thể khó hơn một chút vì bạn phải sao chép giá trị chính xác của nó:

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

Bạn có thể làm tất cả những điều này dễ dàng hơn thông qua 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"

Bạn đã thấy một cách tốt để nhập / di chuyển sắp xếp lại các công việc đã lên lịch sang định dạng của sidekiq chưa? Đặt không gian tên của sidekiq thành 'resque' dường như không nhận công việc đã lên lịch từ những gì tôi có thể nói. Cảm ơn!
Brian Armstrong,

31
Một số giải pháp được cung cấp ở đây không được dùng nữa.
Peter Wagenet

@BrianArmstrong Sidekiq.redis {| r | r.zrange ("lịch trình", 0, -1, {withscores: true})} đã làm việc cho tôi khi tham chiếu stackoverflow.com/questions/16009639/…
Paul

2
Như Wagenet đã chỉ ra ở trên, những ví dụ này đã lỗi thời; như mkirk đã chỉ ra bên dưới, các tài liệu mới nhất có / ví dụ trên wiki: github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues đã được thay thế bằng Sidekiq::Queue.allSidekiq::Client.registered_workersbằng Sidekiq::Workers.new, xem: github.com/mperham/sidekiq/blob/…
Martin Svoboda

136

Có một API công thái học để xem và quản lý hàng đợi .

Nó không được yêu cầu theo mặc định.

require 'sidekiq/api'

Đây là đoạn trích:

# 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

Bạn cũng có thể nhận được một số thống kê tóm tắt.

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
Đây là cách tiếp cận hoạt động ngay bây giờ (tháng 8 năm 2016). Câu trả lời được chấp nhận đã lỗi thời kể từ ~ 2013.
Jan Klimo

10

nếu có bất kỳ công việc đã lên lịch. Bạn có thể xóa tất cả các công việc bằng lệnh sau:

Sidekiq::ScheduledSet.new.clear

nếu có bất kỳ hàng đợi nào bạn muốn xóa tất cả các công việc, bạn có thể sử dụng lệnh sau:

  Sidekiq::Queue.new.clear

Thử lại Công việc cũng có thể được xóa bằng lệnh sau:

Sidekiq::RetrySet.new.clear

Có thêm thông tin ở đây tại liên kết sau, bạn có thể kiểm tra: https://github.com/mperham/sidekiq/wiki/API



2

Một cách giải quyết là sử dụng mô-đun kiểm tra (yêu cầu 'sidekiq / testing') và tiêu hao worker (MyWorker.drain).


2

Có những 'công nhân' bị treo trong hàng đợi mặc định và tôi có thể nhìn thấy họ qua giao diện web. Nhưng chúng không có sẵn trên bảng điều khiển nếu tôi sử dụng 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

Sử dụng redis-cli, tôi có thể tìm thấy chúng

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

Giải pháp là:

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

Ngoài ra trong Sidekiq v3 có một lệnh

Sidekiq::Workers.new.prune

Nhưng vì lý do nào đó mà nó không hoạt động với tôi ngày hôm đó


2

Và nếu bạn muốn xóa hàng đợi thử lại sidekiq, đó là: 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
Đừng bao giờ chạy keys *trên sản xuất trừ khi bạn chỉ sử dụng redis đó cho sidekiq. Đặc biệt không chạy nó nếu bạn có tập dữ liệu lớn (bộ nhớ cache, v.v.). Redis là một luồng và keys *các khối - điều này có thể dẫn đến thời gian ngừng hoạt động trong vài phút trên các tập dữ liệu lớn (vài Gbs).
timurb vào

1

Thực hiện nhiệm vụ để xóa tất cả các hàng đợi sidekiq:

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

Sử dụng:

rake sidekiq:clear
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.