В настоящее время я работаю над REST API, используя фреймворк Node hapijs. API развернут на Heroku.Ошибка таймаута Heroku H12 с Node.js
В API есть конечная точка GET, которая запрашивает запрос на получение данных от третьей стороны и обрабатывает данные перед отправкой ответа. Эта конкретная точка времени время от времени. Когда конечная точка истечет, Heroku возвращает ошибку H12. По истечении времени ожидания последующие запросы к этой конечной точке приводят к ошибкам H12. Я должен перезапустить приложение на Heroku, чтобы снова запустить эту конечную точку. Никакая другая конечная точка в API никоим образом не затрагивается этой ошибкой и продолжает работать нормально даже после возникновения ошибки.
В процессе отладки и просмотра журналов кажется, что есть моменты, когда ответ не возвращается из стороннего API, вызывая ошибку.
Я попытался следующие решения, чтобы попытаться решить проблему:
Я использую библиотеку запроса для выполнения запросов. Следовательно, я попытался установить тайм-аут до 5000 мс в качестве части параметров, переданных в запрос. Он работал время от времени ... таймаут запускается, и конечная точка отправляет ошибку тайм-аута, связанную с запросом. Это поведение, которое я бы хотел, поскольку последующие запросы к конечной точке работают. Однако есть моменты, когда таймаут запроса не запускается, но Heroku все еще возвращает ошибку H12 (всегда через 30 секунд, по умолчанию Heroku). После этого последующие запросы к этой конечной точке возвращают ошибку H12 (также через 30 секунд). Похоже, что какой-то процесс «застревает» на Heroku и не прерывается, пока я не перезапущу приложение.
Я попытался добавить тайм-аут в объект конфигурации маршрута hapi.js. Я получаю те же результаты, что и выше.
Я продолжал исследования и подозревал, что проблемы связаны с описанием here и here. Кажется, что установить тайм-аут на уровне сервера приложений, который может отправить SIGKILL для рабочего Heroku, может сделать трюк. В Ruby это выглядит довольно просто, но я не могу найти много информации о том, как это сделать в узле.
Любое понимание очень ценится. Я знаю, что при обращении к третьей стороне может возникнуть тайм-аут. Это не проблема. Проблема в том, что конечная точка, кажется, «застревает» на Heroku после таймаута, и она перестает реагировать.
Спасибо за помощь!
Если это поможет вам, пожалуйста, отметьте его как принято отвечать. Благодаря! – lwdthe1
Это именно то, что фиксировало мою проблему с выходом H12. Благодаря! –