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!
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!
Câu trả lời:
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"
Sidekiq::Client.registered_queues
đã được thay thế bằng Sidekiq::Queue.all
và Sidekiq::Client.registered_workers
bằng Sidekiq::Workers.new
, xem: github.com/mperham/sidekiq/blob/…
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
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
Có một API để truy cập thông tin thời gian thực về công nhân, hàng đợi và công việc.
Truy cập tại đây https://github.com/mperham/sidekiq/wiki/API
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).
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 đó
Và nếu bạn muốn xóa hàng đợi thử lại sidekiq, đó là: Sidekiq::RetrySet.new.clear
$ 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"
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).