Как убрать застрявших / несвежих работников Resque? - PullRequest
130 голосов
/ 14 сентября 2011

Как видно из прикрепленного изображения, у меня есть пара рабочих, которые, похоже, застряли.Эти процессы не должны занимать больше пары секунд.

enter image description here

Я не уверен, почему они не будут удалены или как их удалить вручную.

Я на Heroku, использую Resque с Redis-to-Go и HireFire для автоматического масштабирования рабочих.

Ответы [ 15 ]

213 голосов
/ 17 мая 2012

Ни одно из этих решений не сработало для меня, я все равно видел бы это в redis-web:

0 out of 10 Workers Working

Наконец, это помогло мне очистить всех рабочих:

Resque.workers.each {|w| w.unregister_worker}
49 голосов
/ 28 сентября 2011

В вашей консоли:

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

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

Resque::Worker.working.each {|w| w.done_working}

EDIT

Многие люди голосовали против этого ответа, и я чувствую, что важно, чтобы люди попробовали решение hagope, которое отменяет регистрацию работников вне очереди, тогда как приведенный выше код удаляет очереди. Если ты счастлив имитировать их, тогда круто.

28 голосов
/ 15 сентября 2011

У вас, вероятно, установлен драгоценный камень resque, поэтому вы можете открыть консоль и получить текущих работников

Resque.workers

Возвращает список работников

#=> [#<Worker infusion.local:40194-0:JAVA_DYNAMIC_QUEUES,index_migrator,converter,extractor>]

выберите работника и prune_dead_workers, например первый

Resque.workers.first.prune_dead_workers
24 голосов
/ 04 февраля 2014

Добавляя ответить hagope, я хотел иметь возможность отменить регистрацию только тех работников, которые работали в течение определенного времени. Приведенный ниже код отменяет регистрацию только рабочих, работающих более 300 секунд (5 минут).

Resque.workers.each {|w| w.unregister_worker if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 300}

У меня есть текущая коллекция задач Rake, связанных с Resque, в которую я также добавил это: https://gist.github.com/ewherrmann/8809350

9 голосов
/ 27 сентября 2011

Запускайте эту команду везде, где вы запускали команду для запуска сервера

$ ps -e -o pid,command | grep [r]esque

вы должны увидеть что-то вроде этого:

92102 resque: Processing ProcessNumbers since 1253142769

Запишите PID (идентификатор процесса) вмой пример это 92102

Тогда вы можете выйти из процесса 1 из 2 способов.

  • Изящно использовать QUIT 92102

  • принудительно использовать TERM 92102

* Я не уверен в синтаксисе, это либо QUIT 92102, либо QUIT -92102

Дайте мне знать, если у вас возникнут проблемы.

6 голосов
/ 24 сентября 2013

Я только что сделал:

% rails c production
irb(main):001:0>Resque.workers

Получил список работников.

irb(main):002:0>Resque.remove_worker(Resque.workers[n].id)

... где n - нулевой индекс нежелательного работника.

2 голосов
/ 13 июля 2017

Я столкнулся с этой проблемой и пошел по пути реализации множества предложений здесь. Однако я обнаружил, что основной причиной, которая создавала эту проблему, было то, что я использовал gem redis-rb 3.3.0 . Понижение до redis-rb 3.2.2 предотвратило застревание этих рабочих.

2 голосов
/ 08 июня 2014

Вот как вы можете удалить их из Redis по имени хоста. Это происходит со мной, когда я списываю сервер, и рабочие не выходят изящно.

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }
2 голосов
/ 15 января 2013

У меня была похожая проблема, что Redis сохранил БД на диск, который включал недопустимых (не работающих) рабочих.Каждый раз, когда Redis / Resque запускался, они появлялись.

Исправьте это, используя:

Resque::Worker.working.each {|w| w.done_working}
Resque.redis.save # Save the DB to disk without ANY workers

Убедитесь, что вы перезапускаете Redis и ваших сотрудников Resque.

1 голос
/ 10 января 2014

Недавно начал работать над https://github.com/shaiguitar/resque_stuck_queue/. Это не решение того, как исправить застрявших рабочих, но оно решает проблему зависания / зависания в реске, поэтому я подумал, что это может быть полезно для людей в этой теме. ОТ README:

"Если resque не запускает задания в течение определенного периода времени, он вызовет предопределенный обработчик по вашему выбору. Вы можете использовать это для отправки электронной почты, обязанности пейджера, добавления дополнительных работников resque, перезапуска resque, отправки вам текст ... все, что вам подходит. "

Используется на производстве и пока работает для меня довольно хорошо.

...