Le funzioni Lambda sono una parte cruciale di qualsiasi distribuzione serverless su Amazon Web Services. Tuttavia, non sono magici e possono presentare alcuni svantaggi, come gli avviamenti a freddo, a causa dei limiti fisici dell’hardware. Provisioned Concurrency può aiutare ad alleviare il problema.
Cosa sono le “avviazioni a freddo”? Gli “avvii a freddo” sono un grosso problema per Lambda, specialmente se considerato per un’applicazione sensibile alla latenza. Il termine si riferisce al tempo di avvio necessario per rendere operativo da zero l’ambiente di esecuzione di una funzione Lambda.
Le funzioni Lambda verranno mantenute “calde” per un po’ dopo averle invocate. Le funzioni non VPC saranno warm per 5 minuti e le funzioni VPC saranno warm per 15 minuti. Durante questo periodo, se la funzione viene richiamata di nuovo, risponderà immediatamente. Questo è ottimo per i servizi che presentano un traffico costante e regolare.
Tuttavia, se il codice non viene eseguito da un po’ di tempo o se deve essere ridimensionato ed eseguire più funzioni simultanee, verrà avviato da zero. Secondo analisi da AWSgli avviamenti a freddo si verificano in meno dell’1% delle richieste nei carichi di lavoro di produzione, il che è accettabile per molti scenari.
Tuttavia, a seconda del runtime utilizzato (Java e .NET impiegano entrambi del tempo per la compilazione JIT), un avvio a freddo potrebbe ritardare l’invocazione della funzione di diversi secondi. Questo può essere inaccettabile per le applicazioni sensibili alla latenza.
Niente più partenze a freddo di Lambda Concorrenza fornita la modalità può aiutare a risolvere questo problema. Puoi pensarla come istanze riservate per le funzioni Lambda: stai essenzialmente riservando una certa quantità di capacità e una funzione Lambda verrà mantenuta calda per l’intero periodo.
Ciò ha grandi vantaggi, inclusa la rimozione quasi completa dei costi di avvio. In realtà non dovrai preoccuparti affatto dell’ottimizzazione del codice di inizializzazione, poiché verrà eseguito una volta e rimarrà in esecuzione. Questo è un grande vantaggio per i linguaggi compilati JIT come Java e C#/.NET, che possono avere file binari di grandi dimensioni e tempi di avvio per caricarli.
Rispetto all’esempio precedente, in cui le funzioni vengono avviate a freddo, la concorrenza con provisioning le avvia tutte in anticipo e le mantiene al caldo. Quando è necessaria una chiamata, Lambda utilizzerà le funzioni warm per eseguirla.
Tuttavia, ha i suoi svantaggi. A causa del modo in cui Lambda seleziona le versioni per le funzioni, la concorrenza con provisioning non funziona con il tag $LATEST. Dovrai creare un nuovo alias, fornire la concorrenza per quell’alias e quindi aggiornarlo quando la versione cambia.
È anche importante comprendere che, nonostante l’esecuzione della funzione per lunghi periodi di tempo, la concorrenza con provisioning non rende l’applicazione con stato. Le funzioni Lambda possono e verranno distrutte e non dovresti trattarle come un server EC2.
Quanto costa la concorrenza fornita? La risposta a questa domanda dipende dalla frequenza con cui viene eseguita la funzione e dalla frequenza con cui vengono creati più ambienti di esecuzione per soddisfare la domanda parallela.
Il numero principale di cui preoccuparsi per la concorrenza con provisioning è il numero di esecuzioni di funzioni in esecuzione contemporaneamente. Ad esempio, se hai una funzione che viene chiamata dieci volte al secondo e ogni chiamata dura 500 ms, quella funzione avrà in media 5 esecuzioni simultanee al secondo.
Nel complesso, la concorrenza con provisioning non costa molto di più delle normali funzioni Lambda. Voi può utilizzare il calcolatore dei prezzi di AWS per capire quanto ti costerà personalmente. Ad esempio, un Lambda chiamato 10 volte al secondo, con un tempo di chiamata di 500 ms e 256 MB di memoria costerà $ 60 al mese per essere eseguito.
Tuttavia, la stessa funzione, ma con 10 esecuzioni fornite, costa un po’ di più a $ 64,50 al mese. Nel complesso, è probabile che si tratti di un piccolo aumento del 5-10% dei costi, a seconda dell’utilizzo.
Tuttavia, la concorrenza con provisioning è in realtà più economica per GB al secondo di utilizzo. Ciò significa che se si esegue costantemente un utilizzo molto vicino al 100%, può essere più economico prenotare la simultaneità rispetto all’utilizzo dei normali prezzi Lambda. Ciò si riduce in gran parte al fatto che nel complesso è più economico ridurre la quantità di tempo che Lambda impiega nel codice di inizializzazione.