Ruby-on-rails 是否有控制台命令可以查看队列中的内容并清除 Sidekiq 中的队列?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12683222/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 20:48:37  来源:igfitidea点击:

Are there console commands to look at whats in the queue and to clear the queue in Sidekiq?

ruby-on-railssidekiq

提问by perseverance

I'm used to using delayed_jobs method of going into the console to see whats in the queue, and the ease of clearing the queue when needed. Are there similar commands in Sidekiq for this? Thanks!

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

采纳答案by bricker

I haven't ever used Sidekiq, so it's possible that there are methods just for viewing the queued jobs, but they would really just be wrappers around Redis commands, since that's basically all Sidekiq (and Resque) is:

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

Unfortunately, removing a specific job is a little more difficult as you'd have to copy its exact value:

不幸的是,删除特定作业有点困难,因为您必须复制其确切值:

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

You could do all of this even more easily via redis-cli:

您可以通过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"

回答by mkirk

There is an ergonomic API for viewing and managing queues.

有一个符合人体工程学的API 用于查看和管理队列

It is not required by default.

默认情况下不需要。

require 'sidekiq/api'

Here's the excerpt:

这是摘录:

# 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

You can also get some summary statistics.

您还可以获得一些汇总统计信息。

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 

回答by Rubyrider

if there is any scheduled job. You may delete all the jobs using the following command:

如果有任何预定的工作。您可以使用以下命令删除所有作业:

Sidekiq::ScheduledSet.new.clear

if there any queues you wanted to delete all jobs you may use the following command:

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

  Sidekiq::Queue.new.clear

Retries Jobs can be removed by the following command also:

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

Sidekiq::RetrySet.new.clear

There are more information here at the following link, you may checkout: https://github.com/mperham/sidekiq/wiki/API

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

回答by Ranjithkumar Ravi

There is a API for accessing real-time information about workers, queues and jobs.
Visit here https://github.com/mperham/sidekiq/wiki/API

有一个用于访问有关工作人员、队列和作业的实时信息的 API。
访问这里https://github.com/mperham/sidekiq/wiki/API

回答by chikamichi

A workaround is to use the testing module (require 'sidekiq/testing') and to drain the worker (MyWorker.drain).

一种解决方法是使用测试模块(需要 'sidekiq/testing')并排空工作器(MyWorker.drain)。

回答by courtsimas

And if you want to clear the sidekiq retry queue, it's this: Sidekiq::RetrySet.new.clear

如果你想清除 sidekiq 重试队列,就是这样: Sidekiq::RetrySet.new.clear

回答by Prashant Vithani

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

回答by Darkside

Rake task for clear all sidekiq queues:

清除所有 sidekiq 队列的 Rake 任务:

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

Usage:

用法:

rake sidekiq:clear

回答by Ivan Linko

There were hanged 'workers' in default queue and I was able to see them though web interface. But they weren't available from console if I used Sidekiq::Queue.new.size

默认队列中挂着“工人”,我可以通过网络界面看到他们。但是如果我使用 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

Using redis-cli I was able to find them

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

The solution was:

解决方案是:

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

Also in the Sidekiq v3 there is a command

同样在 Sidekiq v3 中有一个命令

Sidekiq::Workers.new.prune

But for some reason it didn't work for me that day

但由于某种原因,那天对我不起作用