Как уничтожить рабочие места, поставленные в очередь работниками реска? - PullRequest
37 голосов
/ 04 мая 2011

Я использую Resque в проекте rails-3 для обработки заданий, которые планируется запускать каждые 5 минут.Недавно я сделал что-то, что ставило в тупик создание этих рабочих мест, и стек охватил более 1000 рабочих мест.Я исправил проблему, которая приводила к тому, что многие задания были поставлены в очередь, и теперь проблема, с которой я столкнулся, заключается в том, что задания, созданные с помощью ошибки, все еще существуют, и поэтому становится сложно протестировать что-либо, поскольку задание добавляется в очередь с более чем 1000 заданий.Я не могу остановить эти работы.Я попытался удалить очередь из redis-cli с помощью команды flushall, но это не сработало.Я что-то пропустил?Потому что я не могу найти способ избавиться от этой работы.

Ответы [ 7 ]

61 голосов
/ 09 января 2013

Воспроизведение приведенных выше ответов. Если вам нужно очистить все очереди, вы можете использовать следующее:

Resque.queues.each{|q| Resque.redis.del "queue:#{q}" }
48 голосов
/ 04 мая 2011

Если вы откроете консоль rails, вы можете запустить этот код, чтобы очистить ваши очереди:

queue_name = "my_queue"
Resque.redis.del "queue:#{queue_name}"
35 голосов
/ 22 апреля 2013

У Resque уже есть метод для этого - попробуйте Resque.remove_queue(queue_name) (см. Документацию здесь ). Внутри он выполняет Resque.redis.del(), но он также выполняет другую очистку, и с помощью метода API (вместо предположений о том, как работает Resque) вы будете более ориентированы на будущее.

14 голосов
/ 20 сентября 2011

Обновлено грабли для очистки (в соответствии с последними изменениями в командах redis): https://gist.github.com/1228863

13 голосов
/ 31 марта 2015

Вот что сейчас работает:

Resque.remove_queue("...")
4 голосов
/ 01 апреля 2016

Введите консоль redis:

redis-cli

Список баз данных:

127.0.0.1:6379> KEYS *
 1) "resque:schedules_changed"
 2) "resque:workers"
 3) "resque:queue:your_overloaded_queue"

"resque:queue:your_overloaded_queue" - дБ, которые вам нужны.

Затем запустите:

DEL resque:queue:your_overloaded_queue

Или, если вы хотите удалить указанные задания в очереди, перечислите несколько значений из БД с помощью команды LRANGE:

127.0.0.1:6379> LRANGE resque:queue:your_overloaded_queue 0 2
1) "{\"class\":\"AppClass\",\"args\":[]}"
2) "{\"class\":\"AppClass\",\"args\":[]}"
3) "{\"class\":\"AppClass\",\"args\":[]}"

Затем скопируйте / вставьте одно значение в LREM команду:

127.0.0.1:6379> LREM resque:queue:your_overloaded_queue 5 "{\"class\":\"AppClass\",\"args\":[]}"
(integer) 5

Где 5 - количество удаляемых элементов.

0 голосов
/ 14 августа 2018

Безопаснее и пуленепробиваемее использовать Resque API, а не удалять все из Redis Resque. Resque делает уборку изнутри.

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

Resque.queues.each {|queue| Resque.remove_queue(queue)}

Очереди будут воссозданы в следующий раз, когда задание будет поставлено в очередь.

Документация

...