Как уничтожить рабочие места, поставленные в очередь работниками реска?

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

7 ответов

Решение

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

queue_name = "my_queue"
Resque.redis.del "queue:#{queue_name}"

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

Resque.queues.each{|q| Resque.redis.del "queue:#{q}" }

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

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

Resque.remove_queue("...")

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

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

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

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

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

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

Войдите в консоль 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

Или, если вы хотите удалить указанные задания в очереди, перечислите несколько значений из db с помощью 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 - количество элементов для удаления.

Другие вопросы по тегам