Verkürzen Sie die SDK-Startzeit für AWS Lambda - AWS SDK for Java 2.x

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.

Verkürzen Sie die SDK-Startzeit für AWS Lambda

Eines der Ziele von AWS SDK for Java 2.x ist es, die Startlatenz für AWS Lambda Funktionen zu reduzieren. Das SDK enthält Änderungen zur Verkürzung der Startzeit, auf die am Ende dieses Themas eingegangen wird.

Dieses Thema konzentriert sich zunächst auf Änderungen, die Sie vornehmen können, um die Kaltstartzeiten zu verkürzen. Dazu gehören Änderungen an Ihrer Codestruktur und an der Konfiguration von Service-Clients.

Verwenden Sie einen AWS CRT-basierten HTTP-Client

Für die Arbeit mit AWS Lambda empfehlen wir die AwsCrtHttpClientfür synchrone Szenarien und die AwsCrtAsyncHttpClientfür asynchrone Szenarien.

Das AWS CRT-basierte HTTP-Clients konfigurieren Thema in diesem Handbuch beschreibt die Vorteile der Verwendung der HTTP-Clients, das Hinzufügen der Abhängigkeit und die Konfiguration ihrer Verwendung durch Service-Clients.

Entfernen Sie ungenutzte HTTP-Client-Abhängigkeiten

Neben der expliziten Verwendung eines AWS CRT-basierten Clients können Sie auch andere HTTP-Clients entfernen, die das SDK standardmäßig bereitstellt. Die Lambda-Startzeit wird reduziert, wenn weniger Bibliotheken geladen werden müssen. Daher sollten Sie alle ungenutzten Artefakte entfernen, die die JVM laden muss.

Der folgende Ausschnitt aus einer pom.xml Maven-Datei zeigt den Ausschluss des Apache-basierten HTTP-Clients und des Netty-basierten HTTP-Clients. (Diese Clients werden nicht benötigt, wenn Sie einen CRT-basierten Client verwenden.) AWS In diesem Beispiel werden die HTTP-Client-Artefakte von der S3-Client-Abhängigkeit ausgeschlossen und das aws-crt-client Artefakt hinzugefügt, um den Zugriff auf die CRT-basierten HTTP-Clients zu ermöglichen. AWS

<project> <properties> <aws.java.sdk.version>2.25.51</aws.java.sdk.version> <properties> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>${aws.java.sdk.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>aws-crt-client</artifactId> </dependency> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <exclusions> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>netty-nio-client</artifactId> </exclusion> <exclusion> <groupId>software.amazon.awssdk</groupId> <artifactId>apache-client</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </project>
Anmerkung

Fügen Sie das <exclusions> Element zu allen Service-Client-Abhängigkeiten in Ihrer Datei hinzu. pom.xml

Konfigurieren Sie Service-Clients für Shortcut-Suchvorgänge

Geben Sie eine Region an

Wenn Sie einen Service-Client erstellen, rufen Sie die region Methode im Service Client Builder auf. Dadurch wird der standardmäßige Regions-Suchvorgang des SDK, der an mehreren Stellen nach AWS-Region Informationen sucht, verkürzt.

Um den Lambda-Code unabhängig von der Region zu halten, verwenden Sie den folgenden Code innerhalb der region Methode. Dieser Code greift auf die vom Lambda-Container festgelegte AWS_REGION Umgebungsvariable zu.

Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
Verwenden der EnvironmentVariableCredentialProvider

Ähnlich wie beim standardmäßigen Suchverhalten für die Regionsinformationen sucht das SDK an mehreren Stellen nach Anmeldeinformationen. Indem Sie angeben EnvironmentVariableCredentialProvider, wann Sie einen Service-Client erstellen, sparen Sie Zeit beim Suchvorgang des SDK.

Anmerkung

Durch die Verwendung dieses Anbieters für Anmeldeinformationen kann der Code in Lambda Funktionen verwendet werden, funktioniert aber möglicherweise nicht auf Amazon EC2 oder anderen Systemen.

Der folgende Codeausschnitt zeigt einen S3-Serviceclient, der für die Verwendung in einer Lambda-Umgebung entsprechend konfiguriert ist.

S3Client s3Client = S3Client.builder() .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))) .credentialsProvider(EnvironmentVariableCredentialsProvider.create()) .httpClient(AwsCrtHttpClient.builder().build()) .build();

Initialisieren Sie den SDK-Client außerhalb des Lambda-Funktionshandlers

Wir empfehlen, einen SDK-Client außerhalb der Lambda-Handler-Methode zu initialisieren. Auf diese Weise kann die Initialisierung des Service-Clients übersprungen werden, wenn der Ausführungskontext wiederverwendet wird. Durch die Wiederverwendung der Client-Instanz und ihrer Verbindungen erfolgen nachfolgende Aufrufe der Handler-Methode schneller.

Im folgenden Beispiel wird die S3Client Instanz im Konstruktor mithilfe einer statischen Factory-Methode initialisiert. Wenn der Container, der von der Lambda-Umgebung verwaltet wird, wiederverwendet wird, wird die initialisierte S3Client Instanz wiederverwendet.

public class App implements RequestHandler<Object, Object> { private final S3Client s3Client; public App() { s3Client = DependencyFactory.s3Client(); } @Override public Object handle Request(final Object input, final Context context) { ListBucketResponse response = s3Client.listBuckets(); // Process the response. } }

Minimiert die Dependency-

Bei Dependency Injection (DI) -Frameworks kann es länger dauern, bis der Einrichtungsvorgang abgeschlossen ist. Sie benötigen möglicherweise auch zusätzliche Abhängigkeiten, deren Laden einige Zeit in Anspruch nimmt.

Wenn ein DI-Framework benötigt wird, empfehlen wir die Verwendung leichter DI-Frameworks wie Dagger.

Verwenden Sie ein Targeting vom Typ Maven Archetype AWS Lambda

Das AWS Java SDK-Team hat eine Maven-Archetype-Vorlage entwickelt, um ein Lambda-Projekt mit minimaler Startzeit zu booten. Sie können aus dem Archetyp ein Maven-Projekt aufbauen und wissen, dass die Abhängigkeiten für die Lambda-Umgebung geeignet konfiguriert sind.

In diesem Blogbeitrag finden Sie weitere Informationen über den Archetyp und eine Beispielbereitstellung.

Ziehen Sie Lambda SnapStart für Java in Betracht

Wenn Ihre Laufzeitanforderungen kompatibel sind, AWS bietet Lambda SnapStart für Java an. Lambda SnapStart ist eine infrastrukturbasierte Lösung, die die Startleistung von Java-Funktionen verbessert. Wenn Sie eine neue Version einer Funktion veröffentlichen, SnapStart initialisiert Lambda sie und erstellt einen unveränderlichen, verschlüsselten Snapshot des Speicher- und Festplattenstatus. SnapStart speichert den Snapshot dann zur Wiederverwendung im Cache.

Änderungen an Version 2.x, die sich auf die Startzeit auswirken

Zusätzlich zu den Änderungen, die Sie an Ihrem Code vornehmen, enthält Version 2.x des SDK for Java drei Hauptänderungen, die die Startzeit reduzieren:

Weitere Ressourcen

Das AWS Lambda Entwicklerhandbuch enthält einen Abschnitt über bewährte Methoden für die Entwicklung von Lambda-Funktionen, der nicht Java-spezifisch ist.

Ein Beispiel für die Erstellung einer cloudnativen Anwendung in Java, die verwendet AWS Lambda, finden Sie in diesem Workshop-Inhalt. Im Workshop werden Leistungsoptimierung und andere bewährte Verfahren erörtert.

Sie können erwägen, statische Images zu verwenden, die im Voraus kompiliert wurden, um die Startlatenz zu reduzieren. Sie können beispielsweise das SDK for Java 2.x und Maven verwenden, um ein natives GraalVM-Image zu erstellen.