Как удалить все вакансии из Sidekiq?


119

Я использую sidekiq для фоновых задач в приложении Rails. Теперь количество рабочих мест становится больше, поэтому я хочу очистить все рабочие места. Я попробовал следующую команду в консоли

Sidekiq::Queue.new.clear

но это давало следующую ошибку.

NameError: uninitialized constant Sidekiq::Queue 

Как мне удалить все задания из sidekiq?


попробуй include 'sidekiq'раньше
Бендж

@BenjaminSinclaire его выдача TypeError: неправильный тип аргумента String (ожидаемый модуль)
Может

3
попробуйте require 'sidekiq'раньше
Uri Agassi

1
Я всегда (на самом деле всегда) путаю include и require :)
Benj

Ответы:



207

Вы можете сделать то, что написано по проблеме 1077 или как написано в этом блоге на noobsippets.

Оба предлагают сделать следующее, и это можно сделать на консоли rails:

Sidekiq.redis { |conn| conn.flushdb }


Похоже, это сбрасывает мою аутентификацию в приложениях Rails, которые я использую (что означает, что мне нужно копировать файлы cookie обратно в свой HTTP-клиент). Есть ли способ предотвратить это?
intcreator

1
Привет, Брандемон. Вы используете Redis для управления сеансом вашего проекта? Поскольку эти команды предназначены для «очистки» всех данных, хранящихся в Redis, это эквивалентно удалению базы данных или таблицы удаления в реляционных базах данных.
jonathanccalixto

1
Это должен быть принятый ответ с учетом его голосов.
M. Habib

Это работает более предсказуемо, чем redis-cli flushdbесли бы вы запускали redis на отдельном сервере от вашего rails-сервера. Мне было интересно, почему redis-cli flushdbне работает, пока я не вспомнил, что мне нужно включать аргументы хоста и порта.
Морис

4
Проблема с этим подходом заключается в том, что если вы используете один и тот же redis / elasticache в разных сервисах, он также очистит все другие данные в redis db.
Чарльз Скария

80

Команды очистки заданий Sidekiq:

require 'sidekiq/api'

# Clear retry set

Sidekiq::RetrySet.new.clear

# Clear scheduled jobs 

Sidekiq::ScheduledSet.new.clear

# Clear 'Dead' jobs statistics

Sidekiq::DeadSet.new.clear

# Clear 'Processed' and 'Failed' jobs statistics

Sidekiq::Stats.new.reset

# Clear specific queue

stats = Sidekiq::Stats.new
stats.queues
# => {"main_queue"=>25, "my_custom_queue"=>1}

queue = Sidekiq::Queue.new('my_custom_queue')
queue.count
queue.clear

3
Вы также можете очистить все очереди с помощью Sidekiq::Queue.all.map(&:clear)... Полезно, когда вы синхронизируете базу
данных

36

Что касается последнего Sidekiq, просто взорвите его:

require 'sidekiq/api'

q = Sidekiq::Queue.new
q.💣

Да, команда очистить все - это буквально смайлик-бомба. Также работает для Sidekiq::RetrySet.

Или, если вам не весело, вы можете использовать q.clear


1
OMG, что это за хрень? @Xavier, есть ли метод с именем .💣, не могли бы вы посоветовать мне документ по этому методу (💣).
codemilan

2
@codemilan См. это сообщение в блоге: blog.honeybadger.io/…
Modus Tollens

Я приступил invalid byte sequence in US-ASCII (ArgumentError)к выполнению q.💣: /
Шанкар Тьягараджан

21
redis-cli flushdb

Вы также можете использовать redis-cli flushall


5
Проблема с этим подходом заключается в том, что если вы используете один и тот же redis / elasticache для разных служб, он также очистит все другие данные в базе данных.
Чарльз Скария

13

Используйте Rails runner в одну строку

rails runner 'Sidekiq.redis { |conn| conn.flushdb }'



1

Если вы хотите удалить задания из определенных очередей, попробуйте:

queue = Sidekiq::Queue.new("default")
queue.each do |job|
  job.klass # => 'TestWorker'
  job.args # => ['easy']
  job.delete if job.jid == 'abcdef1234567890' || job.klass == 'TestWorker'
end

Прочтите все о sidekiq и важных консольных командах - https://medium.com/@shashwat12june/all-you-need-to-know-about-sidekiq-a4b770a71f8f



0

Я понял, что Sidekiq.redis { |conn| conn.flushdb }удаляет все ключи из базы данных redis. Есть более безопасный способ очистить все очереди sidekiq, используя redis-cli:

redis-cli keys "*queue:*" | xargs redis-cli del

То же самое может быть достигнуто с помощью Sidekiq API (см. Ответ Рави Пракаша Сингха )

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.