Как удалить все вакансии из 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 }

jonathanccalixto
источник
Похоже, это сбрасывает мою аутентификацию в приложениях 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
rusllonrails
источник
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 }'
Fangxing
источник
10

Все задачи Sidekiq сохраняются в «Redis».

Вы можете очистить Redis с помощью этой команды

redis-cli flushall
Андрей Кондзолко
источник
8

Вы можете использовать это для очистки всех заданий

require 'sidekiq/api'

Sidekiq::Queue.all.each(&:clear)
Рави Пракаш Сингх
источник
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 (см. Ответ Рави Пракаша Сингха )

Hirurg103
источник