Come faccio a ridurre la durata della latenza nell'inizializzazione e nelle chiamate per la mia funzione Lambda in Java?

4 minuti di lettura
0

La mia funzione AWS Lambda in Java non funziona in modo ottimale. Perché sta succedendo questo e come posso ridurre l'inizializzazione e la durata della latenza della mia funzione in Java?

Breve descrizione

Esistono due fattori principali che possono contribuire all'elevata latenza in una funzione Lambda in Java:

Caricamento lento delle classi di Java Virtual Machine (JVM)

Per ridurre l'utilizzo della memoria, JVM ritarda l'inizializzazione di una libreria di classi Java fino alla prima chiamata della libreria in un'applicazione. Questo ritardo può causare un numero elevato di operazioni di input-output (I/O), con conseguenti latenze di durata più elevate per le prime chiamate in un ambiente di esecuzione Lambda.

API Java Reflection

L'API Java Reflection consente al codice Java di scoprire informazioni su altre classi, interfacce, campi e metodi e quindi di operare sui valori sottostanti. Poiché la riflessione coinvolge tipi risolti dinamicamente, alcune ottimizzazioni JVM non possono essere eseguite. Di conseguenza, le operazioni di riflessione hanno prestazioni più lente rispetto alle operazioni che non utilizzano questa caratteristica.

Per ottimizzare le prestazioni della funzione Lambda in Java, puoi implementare una o più delle procedure consigliate descritte in questo articolo.

Nota: Per vedere un caso di studio specifico, guarda AWS re:Invent 2019: Best practices for AWS Lambda and Java.

Soluzione

Configura la simultaneità fornita per la tua funzione Lambda

La simultaneità fornita inizializza un numero richiesto di ambienti di esecuzione in modo che siano pronti a rispondere immediatamente alle chiamate della funzione. Per configurare la simultaneità fornita per la tua funzione, segui le istruzioni in Configurazione della simultaneità fornita.

Per ulteriori informazioni, consulta Managing concurrency for a Lambda function.

Nota: La configurazione della simultaneità fornita comporta costi sul tuo account AWS. Puoi configurare la simultaneità fornita su una versione di una funzione o su un alias della funzione Lambda.

Inizializza la logica statica della tua funzione all'esterno del gestore delle funzioni

Quando inizializzi una funzione Lambda, Lambda alloca un'espansione della capacità della CPU host a 10 secondi. A causa di questa espansione della CPU, è consigliabile eseguire le seguenti operazioni all'esterno del gestore delle funzioni:

  • Importa librerie e dipendenze
  • Imposta la configurazione
  • Inizializza le connessioni ad altri servizi

L'inizializzazione statica consente a queste risorse di essere inizializzate una volta per ambiente di sperimentazione (sandbox) e quindi riutilizzate successivamente per tutte le chiamate future nell'ambiente di esecuzione.

Per ulteriori informazioni, consulta Ottimizzazione dell'inizializzazione statica.

Effettua chiamate API a qualsiasi libreria caricata lentamente all'esterno del gestore delle funzioni

Per evitare il caricamento lento delle librerie durante l'inizializzazione, puoi effettuare chiamate API fittizie a qualsiasi libreria caricata lentamente all'esterno del gestore delle funzioni. Queste chiamate fittizie inizializzano le librerie e preriscaldano l'SDK che stai utilizzando.

Nota: Le chiamate fittizie a librerie caricate lentamente possono fallire se Lambda non dispone delle informazioni necessarie per una chiamata API riuscita. Se la chiamata fallisce, assicurati di aver rilevato l'errore.

Riduci le operazioni di riflessione nel tuo codice Lambda

Le operazioni di riflessione hanno prestazioni più lente rispetto alle operazioni che non utilizzano questa caratteristica. Evita le operazioni di riflessione nelle sezioni di codice che vengono richiamate frequentemente.

Riduci il numero di classi nella tua applicazione

La riduzione delle dimensioni del pacchetto di implementazione in base alle esigenze di runtime diminuisce il tempo necessario per richiamare la funzione.

Per ulteriori informazioni, consulta Best practices for working with AWS Lambda functions.

Imposta in anticipo i parametri di configurazione della tua funzione Lambda

L'impostazione anticipata dei parametri di configurazione della funzione riduce le chiamate alla tua funzione e la durata della latenza. Se non specifichi variabili di configurazione nel codice, Lambda impiega più tempo per scoprire le variabili predefinite per la tua funzione.

Per ulteriori informazioni, consulta la sezione Codice della funzione in Best practices for working with AWS Lambda functions.

Aggiornamento all'SDK AWS per Java 2.0

Per ulteriori informazioni, consulta Tuning the AWS Java SDK 2.x to reduce startup time.

Nota: L'SDK AWS per Java 2.0 include il client HTTP Apache e il client HTTP Netty per impostazione predefinita, insieme al client HTTP URL Connection Java. È consigliabile rimuovere i client HTTP Apache e Netty dal pacchetto di implementazione se non sono necessari per il tuo caso d'uso.


AWS UFFICIALE
AWS UFFICIALEAggiornata 3 anni fa