2016-05-13 14 views
0

Ich arbeite an einem Projekt, wo ich eine Lambda-Funktion verwenden, um eine Verbindung zu einer relationalen Datenbank und DynamoDB zur gleichen Zeit herzustellen. Um auf diese Funktion zuzugreifen, benutze ich API Gateway, aber ich habe ein Problem gefunden: Meine Lambda-Funktion, geschrieben in Java, benötigt mehr als 10 Sekunden, um zu starten, da beide Datenbankverbindungen erstellt wurden.Handle Timeout in AWS API Gateway

Ich weiß API Timeout ist 10 Sekunden, und das ist kein Problem, die Ausführung meiner Funktion dauert weniger als 1 Sekunde, aber das Problem ist, wenn es zu starten ist. Ich würde gerne wissen, wie diese Timeout-Ausnahme zu fangen und dem Benutzer mitteilen, dass er die Anfrage erneut starten muss.

Gibt es eine Möglichkeit dies zu tun, ohne zu Node.js zu wechseln oder direkt auf Lambda-Funktion zuzugreifen?

Antwort

1

Da die Kosten für den Verbindungsaufbau zu einer relationalen Datenbank so hoch sind, möchte ich Sie ermutigen, die Verbindung im Initialisierungscode Ihrer Lambda-Funktion (außerhalb des Handlers) zu öffnen.

Die Datenbankverbindung wird dann für die gesamte Lebensdauer des Lambda-Containers über mehrere Aufrufe hinweg wiederverwendet. In Ihrem Lambda-Funktionshandler möchten Sie vielleicht sicherstellen, dass die Verbindung aktiv ist und nicht abgelaufen ist, und Sie können sie bei Bedarf erneut öffnen.

Der erste Aufruf über das API-Gateway kann zu einem Timeout führen, aber nachfolgende Aufrufe verwenden die Verbindung für die gesamte Lebensdauer des Containers erneut.

Ein weiterer Trick besteht darin, eine geplante Funktion zu erstellen, um Ihre Funktion regelmäßig aufzurufen, um den Container "warm" zu halten.

Cheers, Ryan

+0

Ich bin schon die Datenbankverbindung außerhalb des Handlers zu initialisieren. Ich werde die geplante Funktion implementieren, um meine Funktion warm zu halten, aber ich habe immer noch Angst, dass ein echter Benutzer die Funktion aktiviert und er die Zeit verliert. Das Problem ist, dass ich nicht weiß, wie man diesen Fehler fängt und den Benutzer benennt, gibt es einen Weg, dies zu tun? –

+0

Ein Timeout würde sich als 504-Fehler mit einer spezifischen Fehlermeldung manifestieren. Sie können diese Arten von Antworten in Ihrer Anwendung sicher abfangen und versuchen, eine entsprechende Fehlermeldung zu erhalten. –