キューの内容を確認し、Sidekiqのキューをクリアするコンソールコマンドはありますか?


97

私はキューに何が入っているか、そして必要なときにキューをクリアするのが簡単であるかを確認するためにコンソールに行くのにdelay_jobsメソッドを使うことに慣れています。これのためにSidekiqに同様のコマンドがありますか?ありがとう!


1
他の人が述べたように、以下の選択された回答は非推奨です。
emf

回答:


90

私はこれまでSidekiqを使用したことがないので、キューに入れられたジョブを表示するためのメソッドが存在する可能性がありますが、それらは基本的にすべてのSidekiq(およびResque)であるため、Redisコマンドのラッパーにすぎません。

# 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

残念ながら、正確な値をコピーする必要があるため、特定のジョブを削除するのは少し難しいです。

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

次の方法で、これらすべてをさらに簡単に行うことができます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"

resqueのスケジュールされたジョブをsidekiqの形式にインポート/移行する良い方法を見ましたか?sidekiqの名前空間を 'resque'に設定しても、スケジュールされたジョブを私が知ることができるものから取得できないようです。ありがとう!
ブライアンアームストロング

31
ここで提供されるソリューションの一部は非推奨です。
Peter Wagenet 14

@BrianArmstrong Sidekiq.redis {| r | r.zrange( "schedule"、0、-1、{withscores:true})}は、stackoverflow.com
Paul

2
Wagenetが上記で指摘したように、これらの例は古くなっています。mkirkが以下で指摘するように、例付きの最新のドキュメントはwikiにあります:github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues 置き換えられているSidekiq::Queue.allSidekiq::Client.registered_workersしてSidekiq::Workers.new、次を参照してください。github.com/mperham/sidekiq/blob/...
マーティン・スヴォボダ

136

キューを表示および管理するための人間工学に基づくAPIがあります

デフォルトでは必要ありません。

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 

9
これが現在機能しているアプローチです(2016年8月)。受け入れられた回答は〜2013の時点で古くなっています。
Jan Klimo 2016

10

スケジュールされたジョブがある場合。次のコマンドを使用して、すべてのジョブを削除できます。

Sidekiq::ScheduledSet.new.clear

すべてのジョブを削除したいキューがある場合は、次のコマンドを使用できます。

  Sidekiq::Queue.new.clear

次のコマンドでもジョブを削除できます。

Sidekiq::RetrySet.new.clear

詳細については、次のリンクをご覧ください。チェックアウトできます:https : //github.com/mperham/sidekiq/wiki/API



2

回避策は、テストモジュールを使用し(「sidekiq / testing」が必要)、ワーカーをドレインする(MyWorker.drain)ことです。


2

デフォルトのキューに「ワーカー」がぶら下がっていて、Webインターフェースからそれらを見ることができました。しかし、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


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
keys *sidekiqにのみredisを使用しない限り、本番環境で実行しないでください。特に大きなデータセット(キャッシュなど)がある場合は実行しないでください。Redisはシングルスレッドでkeys *ブロックされます。これにより、大きなデータセット(数GB)で数分のダウンタイムが発生する可能性があります。
timurb 2017

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.