Долгосрочные задания delayed_job остаются заблокированными после перезапуска на Heroku
Когда работник Heroku перезапускается (по команде или в результате развертывания), Heroku отправляетSIGTERM
на рабочий процесс. В случаеdelayed_job
,SIGTERM
сигнал пойман и затем работник прекращает выполнение после того, как текущее задание (если оно есть) было остановлено.
Если рабочий займет много времени, чтобы закончить, то Heroku отправитSIGKILL
, В случаеdelayed_job
это оставляет заблокированную работу в базе данных, которую другой работник не сможет получить.
Я хотел бы убедиться, что задания в конечном итоге завершатся (если только нет ошибки). Учитывая это, как лучше всего подойти к этому?
Я вижу два варианта. Но я бы хотел получить другой вклад:
Modifydelayed_job
to stop working on the current job (and release the lock) when it receives a SIGTERM
.
Figure out a (programmatic) way to detect orphaned locked jobs and then unlock them.
Какие-нибудь мысли?