Implementieren Sie Code vor oder nach Lambda-Funktions-Snapshots - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Implementieren Sie Code vor oder nach Lambda-Funktions-Snapshots

Sie können Laufzeit-Hooks verwenden, um Code zu implementieren, bevor Lambda einen Snapshot erstellt oder nachdem Lambda eine Funktion aus einem Snapshot fortsetzt. aufzeit-Hooks sind als Teil des Open-Source-Projekts Coordinated Restore at Checkpoint (CRaC) verfügbar. CRaC wird für das Open-Java-Entwicklungs-Kit (OpenJDK) entwickelt. Ein Beispiel für die Verwendung von cRAC mit einer Referenzanwendung finden Sie im cRAC-Repository unter. GitHub CRaC verwendet drei Hauptelemente:

  • Resource – Eine Schnittstelle mit zwei Methoden, beforeCheckpoint() und afterRestore(). Verwenden Sie diese Methoden, um den Code zu implementieren, den Sie vor einem Snapshot und nach einer Wiederherstellung ausführen möchten.

  • Context <R extends Resource> – Um Benachrichtigungen für Prüfpunkte und Wiederherstellungen zu erhalten, muss eine Resource mit einem Context registriert sein.

  • Core – Der Koordinationsservice, der das standardmäßige globale Context über die statische Methode Core.getGlobalContext() bereitstellt.

Weitere Informationen zum Context und Resource finden Sie unter Paket org.crac in der CRaC-Dokumentation.

Gehen Sie wie folgt vor, um Laufzeit-Hooks mit dem Paket org.crac zu implementieren. Die Lambda-Laufzeit enthält eine angepasste CRaC-Kontextimplementierung, die Ihre Laufzeit-Hooks vor dem Checkpointing und nach der Wiederherstellung aufruft.

Schritt 1: Aktualisieren der Entwicklungskonfiguration

Fügen Sie die org.crac-Abhängigkeit zur Entwicklungskonfiguration hinzu. Im folgenden Beispiel wird Gradle verwendet. Beispiele für andere Entwicklungssysteme finden Sie in der Apache-Maven-Dokumentation.

dependencies { compile group: 'com.amazonaws', name: 'aws-lambda-java-core', version: '1.2.1' # All other project dependecies go here: # ... # Then, add the org.crac dependency: implementation group: 'org.crac', name: 'crac', version: '1.4.0' }

Schritt 2: Aktualisieren des Lambda-Handlers

Der Lambda-Funktionshandler ist die Methode in Ihrem Funktionscode, die Ereignisse verarbeitet. Wenn Ihre Funktion aufgerufen wird, führt Lambda die Handler-Methode aus. Ihre Funktion wird so lange ausgeführt, bis der Handler eine Antwort zurückgibt, beendet wird oder ein Timeout auftritt.

Weitere Informationen finden Sie unter Definieren Sie den Lambda-Funktionshandler in Java.

Der folgende Beispielhandler zeigt, wie Code vor Checkpointing (beforeCheckpoint()) und nach der Wiederherstellung (afterRestore()) ausgeführt wird. Dieser Handler registriert auch die Resource im Laufzeit-verwalteten globalen Context.

Anmerkung

Wenn Lambda einen Snapshot erstellt, kann Ihr Initialisierungscode bis zu 15 Minuten lang ausgeführt werden. Das Zeitlimit beträgt 130 Sekunden oder das konfigurierte Funktions-Timeout (maximal 900 Sekunden), je nachdem, welcher Wert höher ist. Ihre beforeCheckpoint()-Laufzeit-Hooks werden auf das Zeitlimit des Initialisierungscodes angerechnet. Wenn Lambda einen Snapshot wiederherstellt, muss die Laufzeit (JVM) geladen werden und afterRestore()-Laufzeit-Hooks müssen innerhalb des Timeout-Limits (10 Sekunden) abgeschlossen werden. Andernfalls erhalten Sie eine. SnapStartTimeoutException

... import org.crac.Resource; import org.crac.Core; ... public class CRaCDemo implements RequestStreamHandler, Resource { public CRaCDemo() { Core.getGlobalContext().register(this); } public String handleRequest(String name, Context context) throws IOException { System.out.println("Handler execution"); return "Hello " + name; } @Override public void beforeCheckpoint(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("Before checkpoint"); } @Override public void afterRestore(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("After restore");

Der Context verwaltet nur ein WeakReference auf dem registrierten Objekt. Wenn für eine Resource eine Garbage Collection durchgeführt wird, werden Laufzeit-Hooks nicht ausgeführt. Ihr Code muss einen starken Verweis auf die Resource beibehalten, um sicherzustellen, dass der Laufzeit-Hook ausgeführt wird.

Hier sind zwei Beispiele für zu vermeidende Muster:

Beispiel – Objekt ohne starke Referenz
Core.getGlobalContext().register( new MyResource() );
Beispiel – Objekte anonymer Klassen
Core.getGlobalContext().register( new Resource() { @Override public void afterRestore(Context<? extends Resource> context) throws Exception { // ... } @Override public void beforeCheckpoint(Context<? extends Resource> context) throws Exception { // ... } } );

Behalten Sie stattdessen eine starke Referenz bei. Im folgenden Beispiel wird die registrierte Ressource nicht von der Garbage Collection erfasst und Laufzeit-Hooks werden konsistent ausgeführt.

Beispiel – Objekt mit starker Referenz
Resource myResource = new MyResource(); // This reference must be maintained to prevent the registered resource from being garbage collected Core.getGlobalContext().register( myResource );