Ответ 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
.