2016-05-12 2 views
1

В настоящее время я работаю над REST API, используя фреймворк Node hapijs. API развернут на Heroku.Ошибка таймаута Heroku H12 с Node.js

В API есть конечная точка GET, которая запрашивает запрос на получение данных от третьей стороны и обрабатывает данные перед отправкой ответа. Эта конкретная точка времени время от времени. Когда конечная точка истечет, Heroku возвращает ошибку H12. По истечении времени ожидания последующие запросы к этой конечной точке приводят к ошибкам H12. Я должен перезапустить приложение на Heroku, чтобы снова запустить эту конечную точку. Никакая другая конечная точка в API никоим образом не затрагивается этой ошибкой и продолжает работать нормально даже после возникновения ошибки.

В процессе отладки и просмотра журналов кажется, что есть моменты, когда ответ не возвращается из стороннего API, вызывая ошибку.

Я попытался следующие решения, чтобы попытаться решить проблему:

  1. Я использую библиотеку запроса для выполнения запросов. Следовательно, я попытался установить тайм-аут до 5000 мс в качестве части параметров, переданных в запрос. Он работал время от времени ... таймаут запускается, и конечная точка отправляет ошибку тайм-аута, связанную с запросом. Это поведение, которое я бы хотел, поскольку последующие запросы к конечной точке работают. Однако есть моменты, когда таймаут запроса не запускается, но Heroku все еще возвращает ошибку H12 (всегда через 30 секунд, по умолчанию Heroku). После этого последующие запросы к этой конечной точке возвращают ошибку H12 (также через 30 секунд). Похоже, что какой-то процесс «застревает» на Heroku и не прерывается, пока я не перезапущу приложение.

  2. Я попытался добавить тайм-аут в объект конфигурации маршрута hapi.js. Я получаю те же результаты, что и выше.

  3. Я продолжал исследования и подозревал, что проблемы связаны с описанием here и here. Кажется, что установить тайм-аут на уровне сервера приложений, который может отправить SIGKILL для рабочего Heroku, может сделать трюк. В Ruby это выглядит довольно просто, но я не могу найти много информации о том, как это сделать в узле.

Любое понимание очень ценится. Я знаю, что при обращении к третьей стороне может возникнуть тайм-аут. Это не проблема. Проблема в том, что конечная точка, кажется, «застревает» на Heroku после таймаута, и она перестает реагировать.

Спасибо за помощь!

ответ

5

У меня была аналогичная проблема, и после сдачи на день я вернулся к ней и нашел свою ошибку. Я не отправлял ответ клиенту при возникновении ошибки на стороне сервера. Убедитесь, что вы возвращаете ответ независимо от результата вашего алгоритма на стороне сервера. Если есть ошибка, верните это. Если запрос был успешным, верните этот ответ. Надеюсь, это поможет.

Если это не поможет, проверьте руководства нашей Heroku по обращению Request Timeouts, особенно запрос Debugging таймаута раздел может быть полезен:

+1

Если это поможет вам, пожалуйста, отметьте его как принято отвечать. Благодаря! – lwdthe1

+1

Это именно то, что фиксировало мою проблему с выходом H12. Благодаря! –

Смежные вопросы