有没有控制台命令可以查看Sidekiq队列中的内容并清空队列?

110

我习惯于使用 delayed_jobs 方法进入控制台查看队列中的内容,并在需要时轻松清除队列。在 Sidekiq 中是否有类似的命令?谢谢!

我习惯使用 delayed_jobs 的方法在控制台中查看队列中的内容,以及在需要时轻松清除队列。请问在 Sidekiq 中是否有类似的命令?谢谢!

1
正如其他人所提到的,下面选择的答案已经过时了。 - emf
10个回答

160

有一个符合人体工程学的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 

11
这是目前有效的方法(截至2016年8月)。接受的答案已经过时,大约在2013年左右。 - Jan Klimo

93

我从未使用过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

很不幸,删除特定的工作会更加困难,因为你必须复制它的确切值:

# 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”似乎无法从中获取计划任务。谢谢! - Brian Armstrong
35
这里提供的某些解决方案已经过时。 - Peter Wagenet
@BrianArmstrong Sidekiq.redis { |r| r.zrange("schedule", 0, -1, {withscores: true}) } 对我有用,参考了https://dev59.com/HmQo5IYBdhLWcg3wfPfK - Paul
2
正如Wagenet在上面指出的那样,这些示例已经过时了;就像mkirk在下面指出的那样,最新的文档和示例都在维基上:https://github.com/mperham/sidekiq/wiki/API - odigity
3
Sidekiq::Client.registered_queues 已被替换为 Sidekiq::Queue.all,而 Sidekiq::Client.registered_workers 则被替换为 Sidekiq::Workers.new,请参见:https://github.com/mperham/sidekiq/blob/52562b715174e447a0f7666136838521fda69214/3.0-Upgrade.md。 - Martin Svoboda

11

如果有任何计划任务,您可以使用以下命令删除所有任务:

Sidekiq::ScheduledSet.new.clear

如果有任何队列需要删除所有作业,您可以使用以下命令:

  Sidekiq::Queue.new.clear

尝试重试作业也可通过以下命令删除:

Sidekiq::RetrySet.new.clear

您可以在以下链接中查看更多信息: https://github.com/mperham/sidekiq/wiki/API


8

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
除非你只在Sidekiq中使用Redis,否则不要在生产环境中运行keys *。特别是在有大型数据集(缓存等)的情况下,更不要这样做。 Redis是单线程的,而keys *会阻塞操作,这可能会导致大型数据集(几个GB)数分钟的停机时间。 - timurb

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
一种解决方法是使用测试模块(require 'sidekiq/testing')并排空工作进程(MyWorker.drain)。

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

0

这不是针对Rails控制台的直接解决方案,但是为了快速监视Sidekiq任务计数和队列大小,您可以使用随Sidekiq 6+一起提供的sidekiqmon二进制文件:

$ sidekiqmon
Sidekiq 6.4.2
2022-07-25 11:05:56 UTC

---- Overview ----
  Processed: 20,313,347
     Failed: 57,120
       Busy: 9
   Enqueued: 17
    Retries: 0
  Scheduled: 37
       Dead: 2,382

---- Processes (1) ----
36f993209f93:15:a498f85c6a12 [server]
  Started: 2022-07-25 10:49:43 +0000 (16 minutes ago)
  Threads: 10 (9 busy)
   Queues: default, elasticsearch, statistics

---- Queues (3) ----
NAME             SIZE  LATENCY
default             0     0.00
elasticsearch      17     0.74
statistics          0     0.00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接