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 la modifica della struttura del codice e della configurazione dei client di servizio.
Usa un AWS CRT-based Client HTTP
Per lavorare con AWS Lambda, consigliamo gli scenari AwsCrtHttpClientAwsCrtAsyncHttpClient
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'uso da parte dei client di servizio.
Rimuovi le dipendenze inutilizzate dei client HTTP
Oltre all'uso esplicito di un AWS CRT-based client, puoi rimuovere altri client HTTP che l'SDK introduce per impostazione predefinita. Il tempo di avvio di Lambda si riduce quando è necessario caricare un numero inferiore di 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 e del client HTTP. Apache-based Netty-based (Questi client non sono necessari quando si utilizza un client.) AWS CRT-based Questo esempio esclude gli artefatti del client HTTP dalla dipendenza del client S3 e li aggiunge per consentire l'aws-crt-clientaccesso ai client HTTP. AWS CRT-based
<project> <properties> <aws.java.sdk.version>2.27.21</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 dei client di servizio nel tuo file. pom.xml
Configura i client di servizio per eseguire ricerche rapide
- Specifica una regione
-
Quando crei un client di servizio, chiama il
regionmetodo nel generatore di client di servizio. Questo accorcia il processo di ricerca della regione predefinito dell'SDK che controlla le informazioni in diverse posizioni. Regione AWSPer mantenere il codice Lambda indipendente dalla regione, utilizza il codice seguente all'interno del metodo.
regionQuesto codice accede alla variabile diAWS_REGIONambiente impostata dal contenitore Lambda.Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())) - Utilizzo della
EnvironmentVariableCredentialProvider -
Proprio come il 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 delle credenziali dell'SDK. Nota
L'utilizzo di questo provider di credenziali consente di utilizzare il codice nelle Lambda funzioni, ma potrebbe non funzionare su altri sistemi. Amazon EC2
Se intendi utilizzare Lambda SnapStart per Java a un certo punto, dovresti fare affidamento sulla catena di provider di credenziali predefinita per cercare le credenziali. Se si specifica il
EnvironmentVariableCredentialsProvider, la ricerca iniziale delle credenziali funziona, ma quando SnapStart viene attivata, il runtime Java imposta le variabili di ambiente delle credenziali del contenitore. Al momento dell'attivazione, le variabili di ambiente utilizzate dalle variabili di ambienteEnvironmentVariableCredentialsProvider—access key— non sono disponibili per Java SDK.
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, l'istanza S3Client inizializzata viene riutilizzata.
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. } }
Ridurre al minimo l'iniezione di dipendenze
I framework di iniezione di dipendenza (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. https://dagger.dev/dev-guide/
Usa un targeting Maven Archetype AWS Lambda
Il team AWS Java SDK ha sviluppato un modello
Per saperne di più sull'archetipo e lavorare su un esempio di implementazione, consulta questo post del blog. https://aws.amazon.com/blogs/developer/bootstrapping-a-java-lambda-application-with-minimal-aws-java-sdk-startup-time-using-maven/
Prendi in considerazione Lambda for Java SnapStart
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 si pubblica una nuova versione di una funzione, Lambda la SnapStart inizializza e acquisisce un'istantanea immutabile e crittografata della memoria e dello stato del disco. SnapStart quindi memorizza nella cache l'istantanea per riutilizzarla.
Per trarne il massimo vantaggio dall'avvio SnapStart, utilizza l'SdkWarmUpAPI per riscaldare tutti i client SDK prima che Lambda scatti l'istantanea. L'istantanea acquisisce quindi i client riscaldati, in modo che ogni funzione ripristinata inizi con quelli pronti. Per ulteriori informazioni, consulta Prendi in considerazione la possibilità di riscaldare i client SDK con SdkWarmUp.
Prendi in considerazione la possibilità di riscaldare i client SDK con SdkWarmUp
L'SdkWarmUpAPI inclusa AWS SDK for Java 2.x riscalda i client SDK durante l'inizializzazione dell'applicazione. Di conseguenza, la prima chiamata all'API di servizio è più veloce. Il riscaldamento crea un client e richiama un'operazione per eseguire il percorso di richiesta dell'SDK. Ciò avviene prima che l'applicazione gestisca il traffico reale. Con una sola chiamata, puoi attivare tutti i client SDK sul tuo classpath o solo i client specifici utilizzati dall'applicazione.
Puoi utilizzare l'SdkWarmUpAPI con funzionalità Lambda che riducono i cold start, come Lambda e provisioned concurrency. SnapStart Per ulteriori informazioni sulla configurazione e l'utilizzo, consulta. SdkWarmUp Riscalda i client SDK nel AWS SDK for Java 2.x
Modifiche alla versione 2.x che influiscono sui tempi di avvio
Oltre alle modifiche apportate al codice, la versione 2.x dell'SDK per 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 data e ora, che fanno parte del JDK
Risorse aggiuntive
La AWS Lambda Developer Guide contiene una sezione sulle migliori pratiche per lo sviluppo di funzioni Lambda che non sono specifiche 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.
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. Configura un progetto GraalVM Native Image che utilizza AWS SDK for Java 2.x