대기열에있는 내용을보고 Sidekiq에서 대기열을 지우는 콘솔 명령이 있습니까?


97

대기열에있는 내용을 확인하기 위해 콘솔로 이동하는 delayed_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'로 설정하면 내가 알 수있는 것에서 예약 된 작업을 선택하지 않는 것 같습니다. 감사!
Brian Armstrong

31
여기에 제공된 일부 솔루션은 더 이상 사용되지 않습니다.
Peter Wagenet

@BrianArmstrong Sidekiq.redis {| r | r.zrange ( "schedule", 0, -1, {withscores : true})} 나를 위해 stackoverflow.com/questions/16009639/…를
Paul

2
Wagenet이 위에서 지적했듯이 이러한 예는 구식입니다. mkirk가 아래에서 지적했듯이, 예제가있는 최신 문서는 위키에 있습니다 : 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

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

기본 대기열에 매달린 '작업자'가 있었고 웹 인터페이스를 통해 볼 수있었습니다. 하지만 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 *블록입니다. 이로 인해 대규모 데이터 세트 (여러 Gbs)에서 몇 분의 다운 타임이 발생할 수 있습니다.
timurb

1

모든 sidekiq 대기열 지우기를위한 레이크 작업 :

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.