Как очистить застрявшие/устаревшие работники Resque?

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

enter image description here

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

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

Ответ 1

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

0 out of 10 Workers Working

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

Resque.workers.each {|w| w.unregister_worker}

Ответ 2

В консоли:

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

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

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

ИЗМЕНИТЬ

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

Ответ 3

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

Resque.workers

Он возвращает список рабочих

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

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

Resque.workers.first.prune_dead_workers

Ответ 4

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

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

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

Ответ 5

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

$ 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

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

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

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

Resque.workers.each { |w| w.unregister_worker if w.id.start_with?(hostname) }

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

Я тоже застрял/застрял в рабочей силе, или я должен сказать "рабочие места", потому что рабочий на самом деле все еще там и работает нормально, это заторможенный процесс.

Я выбрал жестокое решение для уничтожения разветвленного процесса "Обработка" с более чем 5 минут через bash script, тогда рабочий просто порождает очередную очередь в очереди, и все продолжает двигаться

взгляните на мой script здесь: https://gist.github.com/jobwat/5712437

Ответ 12

Я очистил их от redis-cli напрямую. К счастью redistogo.com позволяет получить доступ из окружения вне героку. Получите идентификатор мертвого работника из списка. Мой был

55ba6f3b-9287-4f81-987a-4e8ae7f51210:2

Запустите эту команду в redis напрямую.

del "resque:worker:55ba6f3b-9287-4f81-987a-4e8ae7f51210:2:*"

Вы можете контролировать redis db, чтобы увидеть, что он делает за кулисами.

redis xxx.redistogo.com> MONITOR
OK
1380274567.540613 "MONITOR"
1380274568.345198 "incrby" "resque:stat:processed" "1"
1380274568.346898 "incrby" "resque:stat:processed:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*" "1"
1380274568.346920 "del" "resque:worker:c65c8e2b-555a-4a57-aaa6-477b27d6452d:2:*"
1380274568.348803 "smembers" "resque:queues"

Вторая последняя строка удаляет рабочего.

Ответ 13

Если вы используете новые версии Resque, вам придется использовать следующую команду, поскольку внутренние API-интерфейсы изменились...

Resque::WorkerRegistry.working.each {|work| Resque::WorkerRegistry.remove(work.id)}

Ответ 14

Это позволяет избежать проблемы до тех пор, пока у вас есть версия resque выше версии 1.26.0:

resque: env QUEUE=foo TERM_CHILD=1 bundle exec rake resque:work

Имейте в виду, что он не позволяет завершить текущую работу.