Как принудительно перезапустить процесс NodeJS в Heroku в случае неустранимой ошибки?

#node.js #heroku #crash

#node.js #heroku #сбой

Вопрос:

Одна из сторонних библиотек редко ведет себя странно и переводит приложение в какое-то странное состояние, из которого невозможно восстановить. Итак, я сделал аварийный выход, чтобы перехватить ошибку, а затем вызываю process.exit(0) в надежде, что Heroku перезапустит его.

Сегодня это произошло впервые, и, к сожалению, Heroku потребовалось около 10 минут, прежде чем он решил перезапустить dyno. По пути он продолжал рассылать спам с error code=H10 desc="App crashed" .

Что может быть лучшим способом справиться с этим, чтобы Heroku немедленно перезапустился? Я бы хотел избежать вызова Heroku API, это странный обходной путь.

Ответ №1:

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

При этом тот факт, что «это заняло у Heroku около 10 минут», объясняется тем, что вы, вероятно, используете их «общую среду выполнения». Если вы хотите, чтобы ваши службы немедленно перезагружались при сбое, вам нужно будет посмотреть на их запуск в «Среде выполнения Private Spaces».

Из документов:

Обычная среда выполнения реализует политику постепенного возврата для сбоев динамических процессоров

Среда выполнения Private Spaces не имеет политики возврата. При сбое dyno он будет непрерывно перезапускаться без периода охлаждения.

Комментарии:

1. Да, я знаю, что это не идеально, но удаление сторонней библиотеки и поиск альтернативы (со своим собственным набором проблем) были бы слишком дорогостоящими, чтобы стоить того. Проблема возникает очень редко (примерно раз в 3 месяца).

2. Не осознавал, что эта политика задержки или отката на самом деле является функцией. Это имеет смысл. Я посмотрю на время выполнения Private Spaces. Спасибо.

Ответ №2:

Вы можете использовать Heroku api, таким образом, вы не получите эту ошибку «Сбой приложения»:https://devcenter.heroku.com/articles/platform-api-reference#dyno-restart

Не забудьте использовать Authorization заголовок: https://devcenter.heroku.com/articles/platform-api-reference#authentication