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)
-
Resource
– Eine Schnittstelle mit zwei Methoden,beforeCheckpoint()
undafterRestore()
. 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 eineResource
mit einemContext
registriert sein. -
Core
– Der Koordinationsservice, der das standardmäßige globaleContext
über die statische MethodeCore.getGlobalContext()
bereitstellt.
Weitere Informationen zum Context
und Resource
finden Sie unter Paket org.crac
Gehen Sie wie folgt vor, um Laufzeit-Hooks mit dem Paket org.crac
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 voidafterRestore
(org.crac.Context<? extends Resource> context) throws Exception { System.out.println("After restore");
Der Context
verwaltet nur ein WeakReference
Resource
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 );