Чи є команди консолі, щоб подивитися, що в черзі, і очистити чергу в Sidekiq?


97

Я звик використовувати метод delay_jobs для входу в консоль, щоб побачити, що в черзі, і простоту очищення черги, коли це потрібно. Чи є для цього подібні команди в Sidekiq? Дякую!


1
як згадують інші, обрана відповідь нижче застаріла.
ЕРС

Відповіді:


90

Я ніколи не використовував 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"

Ви бачили хороший спосіб імпортувати / мігрувати заздалегідь заплановані завдання у формат sidekiq? Якщо встановити простір імен Sidekiq на 'resque', схоже, не вибираються заплановані завдання з того, що я можу сказати. Дякую!
Брайан Армстронг

31
Деякі із запропонованих тут рішень застаріли.
Пітер Вагенет

@BrianArmstrong Sidekiq.redis {| r | r.zrange ("графік", 0, -1, {withscores: true})} працював для мене, посилаючись на stackoverflow.com/questions/16009639/…
Павло

2
Як Вагенет вказував вище, ці приклади застаріли; як вказано нижче mkirk, останні документи з прикладами містяться у вікі: github.com/mperham/sidekiq/wiki/API
odigity

1
Sidekiq::Client.registered_queues замінено на Sidekiq::Queue.allі Sidekiq::Client.registered_workersз Sidekiq::Workers.new, див .: github.com/mperham/sidekiq/blob/…
Martin Svoboda

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 року). Прийнята відповідь застаріла станом на ~ 2013 рік.
Ян Клімо

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 *працюйте на виробництві, якщо ви не використовуєте цей Redis лише для Sidekiq. Особливо не запускайте його, якщо у вас є великий набір даних (кеш тощо). 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.