Как уничтожить рабочие места, поставленные в очередь работниками реска?
Я использую 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) вы будете более ориентированы на будущее.
Обновленное грабли для очистки (в соответствии с последними изменениями в командах 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 - количество элементов для удаления.