2012-10-02 30 views

回答

84

我還沒有用過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 

不幸的是,除去具體的工作是多一點困難,因爲你不得不復制其確切值:更容易通過redis-cli

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

你可以做到這一切:

$ 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" 
+0

你見過導入/遷移resque計劃作業到sidekiq的格式的好辦法?將sidekiq的名稱空間設置爲'resque'似乎並不能從我所知道的內容中找到預定的作業。謝謝! –

+16

此處提供的某些解決方案已棄用。 –

+0

@BrianArmstrong Sidekiq.redis {| r | r.zrange(「schedule」,0,-1,{withscores:true})}爲我工作,引用http://stackoverflow.com/questions/16009639/sidekiq-to-cancel-list-to-scheduled-jobs – Paul

2

解決方法是使用測試模塊(require'sidekiq/testing')並排除worker(MyWorker.drain)。

102

有一個符合人體工程學的API for viewing and managing queues

默認情況下不需要。

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 
+4

這是現在可以使用的方法(2016年8月)。接受的答案在2013年過時了。 –

1

有被絞死的'工人'在默認隊列中,我可以通過網絡界面看到他們。但他們無法從控制檯,如果我用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

9

如果有任何計劃的作業。您可以使用以下命令刪除所有作業:

Sidekiq::ScheduledSet.new.clear 

如果你想刪除您可以使用下面的命令所有作業的所有隊列:

Sidekiq::Queue.new.clear 

重試作業可以通過以下被刪除命令還:

Sidekiq::RetrySet.new.clear 

有在以下鏈接這裏有更多的信息,你可以退房: https://github.com/mperham/sidekiq/wiki/API

1

清晰所有sidekiq隊列Rake任務:

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

用法:

rake sidekiq: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" 
+2

除非您僅將redis僅用於sidekiq,否則請勿在生產中運行'鍵*'。特別是如果你有大數據集(緩存等),不要運行它。 Redis是單線程和'keys *'塊 - 這可能會導致大型數據集(幾個千兆位)幾分鐘的停機時間。 – timurb