2016-05-12 9 views
1

Derzeit arbeite ich an einer REST-API mit dem Node hapijs Framework. Die API wird auf Heroku bereitgestellt.Heroku H12 Timeout Fehler mit Node.js

In der API gibt es einen GET-Endpunkt, der eine Abrufanforderung zum Abrufen von Daten von einer dritten Partei vornimmt und die Daten verarbeitet, bevor eine Antwort gesendet wird. Dieser spezielle Endpunkt läuft von Zeit zu Zeit ab. Wenn der Endpunkt das Zeitlimit überschreitet, gibt Heroku einen H12-Fehler zurück. Sobald das Zeitlimit überschritten ist, führen nachfolgende Anforderungen an diesen Endpunkt zu den H12-Fehlern. Ich muss die Anwendung auf Heroku neu starten, damit dieser Endpunkt wieder funktioniert. Keine anderen Endpunkte in der API sind in irgendeiner Weise von diesem Fehler betroffen und funktionieren auch nach dem Auftreten des Fehlers einwandfrei.

In meinem Debugging-Prozess und dem Durchsuchen der Protokolle scheint es Zeiten zu geben, in denen keine Antwort von der API der dritten Partei zurückgegeben wird, die den Fehler verursacht.

Ich habe folgende Lösungen versucht, das Problem zu versuchen und zu lösen:

  1. ich die Anfrage Bibliothek bin mit Anfragen zu machen. Daher habe ich versucht, ein Timeout auf 5000 ms als Teil der Optionen einzustellen, die an die Anfrage übergeben wurden. Es hat manchmal funktioniert ... das Timeout wird ausgelöst und der Endpunkt sendet den Timeout-Fehler, der mit der Anfrage verbunden ist. Dies ist die Art von Verhalten, das ich möchte, da nachfolgende Anforderungen an den Endpunkt funktionieren. Es gibt jedoch Zeiten, in denen das Anforderungstimeout nicht ausgelöst wird, aber Heroku immer noch einen H12-Fehler zurückgibt (immer nach 30 Sekunden, der Heroku-Standard). Danach geben nachfolgende Anforderungen an diesen Endpunkt den H12-Fehler zurück (ebenfalls nach 30 Sekunden). Es scheint so, als ob irgendein Prozess auf Heroku "hängenbleibt" und erst beendet wird, wenn ich die App neu starte.

  2. Ich habe versucht, ein Timeout zum hapi.js route config Objekt hinzuzufügen. Ich bekomme die gleichen Ergebnisse wie oben.

  3. Ich habe die Forschung fortgesetzt und vermute, dass die Probleme mit der Beschreibung here und here zu tun haben. Es scheint so, als würde ein Zeitlimit auf App-Server-Ebene gesetzt werden, das ein SIGKILL an den Heroku-Mitarbeiter senden könnte. Es scheint in Ruby ziemlich einfach zu sein, aber ich kann nicht viele Informationen darüber finden, wie man das in Node macht.

Jeder Einblick wird sehr geschätzt. Mir ist bewusst, dass eine Zeitüberschreitung auftreten kann, wenn eine Anfrage an eine dritte Partei gerichtet wird. Das ist nicht das Problem. Das Problem ist, dass der Endpunkt nach einer Zeitüberschreitung auf Heroku "hängenbleibt" und nicht mehr reagiert.

Danke für die Hilfe!

Antwort

5

Ich hatte ein ähnliches Problem und nachdem ich für einen Tag aufgegeben hatte, kam ich zurück und fand meinen Fehler. Ich habe keine Antwort an den Client gesendet, als auf der Serverseite ein Fehler aufgetreten ist. Stellen Sie sicher, dass Sie eine Antwort zurückgeben, unabhängig davon, was das Ergebnis Ihres serverseitigen Algorithmus ist. Wenn es einen Fehler gibt, gib das zurück. Wenn die Anfrage erfolgreich war, geben Sie diese Antwort zurück. Ich hoffe das hilft.

Wenn das nicht hilft, überprüfen Führer unserer Heroku der Request Timeouts zur Handhabung, insbesondere das Debuggen Anfrage Timeouts Abschnitt Hilfe sein könnte:

+1

Wenn dies hilft Ihnen, fügen Sie es als akzeptierte Antwort markieren. Vielen Dank! – lwdthe1

+1

Das ist genau das, was mein H12 Timeout Problem behoben hat. Vielen Dank! –