Когда рабочий из Heroku перезапускается (либо по команде, либо в результате развертывания), Heroku отправляет SIGTERM в рабочий процесс. В случае delayed_job сигнал SIGTERM пойман, а затем рабочий прекращает выполнение после того, как текущее задание (если оно есть) остановлено,
Если работник добирается до конца, тогда Героку отправит SIGKILL. В случае delayed_job это оставляет заблокированное задание в базе данных, которое не будет получено другим работником.
Я бы хотел, чтобы задания заканчивались (если не было ошибок). Учитывая, что лучший способ приблизиться к этому?
Я вижу два варианта. Но я хотел бы получить другой ввод:
- Измените
delayed_job, чтобы прекратить работу над текущим заданием (и отпустите блокировку), когда он получитSIGTERM. - Выясните (программный) способ обнаружения сиротских заблокированных заданий, а затем разблокируйте их.
Любые мысли?