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.
Sie können Laufzeit-Hooks verwenden, um Code zu implementieren, bevor Lambda einen Snapshot erstellt oder nachdem Lambda eine Funktion aus einem Snapshot fortsetzt. Runtime-Hooks sind als Teil des Open-Source-Projekts Coordinated Restore at Checkpoint (CRaC) verfügbar. CRaC befindet sich in der Entwicklung für das Open Java Development 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 zu Context
und Resource
finden Sie unter Package org.crac
Gehen Sie wie folgt vor, um Laufzeit-Hooks mit dem Paket org.crac
Registrierung und Ausführung von Laufzeit-Hooks
Die Reihenfolge, in der Lambda Ihre Laufzeit-Hooks ausführt, wird durch die Reihenfolge der Registrierung bestimmt. Die Reihenfolge der Registrierung entspricht der Reihenfolge des Imports, der Definition oder der Ausführung in Ihrem Code.
-
beforeCheckpoint()
: Wird in umgekehrter Reihenfolge der Registrierung ausgeführt -
afterRestore()
: Wird in Reihenfolge der Registrierung ausgeführt
Vergewissern Sie sich, dass alle registrierten Hooks ordnungsgemäß importiert und in den Code Ihrer Funktion aufgenommen wurden. Wenn Sie Laufzeit-Hooks in einer separaten Datei oder einem Modul registrieren, müssen Sie sicherstellen, dass das Modul entweder direkt oder als Teil eines größeren Pakets in der Handler-Datei Ihrer Funktion importiert wird. Wenn die Datei oder das Modul nicht in den Funktionshandler importiert wird, ignoriert Lambda die Laufzeithaken.
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 geladen werden und afterRestore()
-Laufzeit-Hooks müssen innerhalb des Timeout-Limits (10 Sekunden) abgeschlossen werden. Andernfalls erhalten Sie eine. SnapStartTimeoutException
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 des Lambda-Funktions-Handlers 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 bekommst du 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
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 );