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

По умолчанию веб-интерфейс resque говорит, что у меня 5 из 7 работающих рабочих. Я не понимаю, как это могло произойти.

Я на геройку, поэтому, когда мой динозапуск перезагружается, он должен крутить существующих динозавров и рабочих, а затем разворачивать новые. Итак, я предполагаю, что некоторые из этих работников устарели, но resque считает, что рабочих больше так много, чем должно быть... (должно быть только 1)

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

В конце концов, я ожидаю, что я сделаю все, что будет в этом сообщении SO: Как очистить застрявшие/устаревшие рабочие Resque?, но сначала я как узнать, как определить, должен ли быть удален работник... Я не хочу слепо отменить регистрацию рабочих...

Извините, если это очевидный вопрос. Я новичок в поиске.

Спасибо!

Ответы

Ответ 1

Единственный способ определить, действительно ли работает рабочий, - проверить хост-машину рабочего. После перезагрузки на Heroku эти машины больше не существуют, поэтому, если работник не отменил регистрацию, Resque поверит, что он все еще работает. Децентрализованный характер работников Resque означает, что вы не можете легко проверить фактический статус работников. Когда каждый рабочий запускается, он регистрируется с помощью redis. Когда этот рабочий забирает задание и начинает работать, он снова регистрирует его статус с помощью redis. Когда вы повторяете так:

Resque.workers.each { |w| w.working? }

вы вытаскиваете список работников из redis и проверяете последнее зарегистрированное состояние этих работников redis. Он фактически не запрашивает самого работника.

Имена хостов на экране resque-web будут совпадать с именами, которые вы видите в выводе журнала heroku, так что один не очень хороший способ увидеть, что на самом деле работает. Я надеялся, что можно автоматизировать, используя идентификаторы dyno, полученные из API платформы, но они не соответствуют именам хостов.

Убедитесь, что вы грациозно управляете Resque::TermException, как указано в этом документе. Вы также можете изучить некоторые из пульсирующих решений, которые другие придумали для решения этой проблемы. У меня были проблемы, когда даже использование TERM_CHILD и правильное обращение с сигналами оставляли заброшенных работников. Мое решение состояло в том, чтобы ждать, пока не будет обработано никаких заданий, отмените регистрацию всех работников, а затем перезапустите с помощью heroku ps:restart worker.

Ответ 2

Попробуйте следующее:

Resque.workers.each do |w| 
  if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 7.days
    w.unregister_worker
  end
end