Riduci i tempi di avvio dell'SDK per AWS Lambda - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Riduci i tempi di avvio dell'SDK per AWS Lambda

Uno degli obiettivi di AWS SDK for Java 2.x è ridurre la latenza di avvio delle funzioni AWS Lambda . L'SDK contiene modifiche che riducono i tempi di avvio, discusse alla fine di questo argomento.

Innanzitutto, questo argomento si concentra sulle modifiche che è possibile apportare per ridurre i tempi di avvio a freddo. Queste includono le modifiche alla struttura del codice e alla configurazione dei client di servizio.

Utilizzate un client AWS HTTP basato su CRT

Per lavorare con AWS Lambda, consigliamo il AwsCrtHttpClientper scenari sincroni e il AwsCrtAsyncHttpClientper scenari asincroni.

L'Configurazione AWS dei client HTTP basati su CRTargomento di questa guida descrive i vantaggi dell'utilizzo dei client HTTP, come aggiungere la dipendenza e come configurarne l'utilizzo da parte dei client di servizio.

Rimuovi le dipendenze inutilizzate del client HTTP

Oltre all'uso esplicito di un client AWS basato su CRT, puoi rimuovere altri client HTTP che l'SDK integra per impostazione predefinita. Il tempo di avvio di Lambda si riduce quando è necessario caricare meno librerie, quindi è necessario rimuovere tutti gli artefatti inutilizzati che la JVM deve caricare.

Il seguente frammento di un pom.xml file Maven mostra l'esclusione del client HTTP basato su Apache e del client HTTP basato su Netty. (Questi client non sono necessari quando si utilizza un client basato su CRT). AWS Questo esempio esclude gli artefatti del client HTTP dalla dipendenza del client S3 e aggiunge l'aws-crt-clientartefatto per consentire l'accesso ai client HTTP basati su CRT. 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>
Nota

Aggiungi l'<exclusions>elemento a tutte le dipendenze del client di servizio nel tuo file. pom.xml

Configura i client di servizio per abbreviare le ricerche

Specificare una regione

Quando crei un client di servizio, chiama il region metodo sul service client builder. Questo accorcia il processo di ricerca regionale predefinito dell'SDK, che controlla le informazioni in diversi punti. Regione AWS

Per mantenere il codice Lambda indipendente dalla regione, usa il codice seguente all'interno del region metodo. Questo codice accede alla variabile di AWS_REGION ambiente impostata dal contenitore Lambda.

Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable()))
Utilizzo dell'EnvironmentVariableCredentialProvider

Analogamente al comportamento di ricerca predefinito per le informazioni sulla regione, l'SDK cerca le credenziali in diversi punti. Specificando EnvironmentVariableCredentialProviderquando si crea un client di servizio, si risparmia tempo nel processo di ricerca dell'SDK.

Nota

L'utilizzo di questo provider di credenziali consente l'utilizzo del codice nelle Lambda funzioni, ma potrebbe non funzionare su Amazon EC2 altri sistemi.

Il seguente frammento di codice mostra un client di servizio S3 configurato in modo appropriato per l'uso in un ambiente Lambda.

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

Inizializza il client SDK all'esterno del gestore di funzioni Lambda

Consigliamo di inizializzare un client SDK al di fuori del metodo del gestore Lambda. In questo modo, se il contesto di esecuzione viene riutilizzato, l'inizializzazione del client di servizio può essere ignorata. Riutilizzando l'istanza del client e le relative connessioni, le successive invocazioni del metodo handler avvengono più rapidamente.

Nell'esempio seguente, l'S3Clientistanza viene inizializzata nel costruttore utilizzando un metodo factory statico. Se il contenitore gestito dall'ambiente Lambda viene riutilizzato, viene riutilizzata l'istanza inizializzataS3Client.

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. } }

Riduci al minimo l'iniezione di dipendenza

I framework di Dependency Injection (DI) potrebbero richiedere più tempo per completare il processo di configurazione. Potrebbero inoltre richiedere dipendenze aggiuntive, il cui caricamento richiede tempo.

Se è necessario un framework DI, consigliamo di utilizzare framework DI leggeri come Dagger.

Usa un targeting Maven Archetype AWS Lambda

Il team AWS Java SDK ha sviluppato un modello Maven Archetype per avviare un progetto Lambda con tempi di avvio minimi. Puoi creare un progetto Maven a partire dall'archetipo e sapere che le dipendenze sono configurate in modo appropriato per l'ambiente Lambda.

Per saperne di più sull'archetipo e illustrare un esempio di implementazione, consulta questo post sul blog.

Prendi in considerazione Lambda SnapStart per Java

Se i requisiti di runtime sono compatibili, AWS offre Lambda SnapStart per Java. Lambda SnapStart è una soluzione basata sull'infrastruttura che migliora le prestazioni di avvio per le funzioni Java. Quando pubblichi una nuova versione di una funzione, Lambda la SnapStart inizializza e scatta un'istantanea crittografata e immutabile della memoria e dello stato del disco. SnapStart quindi memorizza l'istantanea nella cache per riutilizzarla.

Modifiche alla versione 2.x che influiscono sul tempo di avvio

Oltre alle modifiche apportate al codice, la versione 2.x dell'SDK for Java include tre modifiche principali che riducono i tempi di avvio:

  • Uso di jackson-jr, una libreria di serializzazione che migliora i tempi di inizializzazione

  • Uso delle librerie java.time per oggetti di data e ora, che fanno parte del JDK

  • Uso di SLF4j per una facciata adibita a registrazione

Risorse aggiuntive

La Guida per gli AWS Lambda sviluppatori contiene una sezione sulle migliori pratiche per lo sviluppo di funzioni Lambda che non è specifica per Java.

Per un esempio di creazione di un'applicazione nativa per il cloud in Java che utilizza AWS Lambda, consulta il contenuto di questo workshop. Il workshop discute dell'ottimizzazione delle prestazioni e di altre best practice.

Puoi prendere in considerazione l'utilizzo di immagini statiche compilate in anticipo per ridurre la latenza di avvio. Ad esempio, puoi utilizzare l'SDK per Java 2.x e Maven per creare un'immagine nativa GraalVM.