Hvis du vil bygge en serverløs arkitektur i AWS, eller i det mindste en del af det, så vil AWS Lambda-tjenesten være den vigtigste del af det.
Det er en serverløs computerfunktion (typisk skrevet i Node.JS eller Python programmeringssprog), som du kan udvikle og køre uden at starte nogen backend-klynger eller -servere. Du kan forbinde flere AWS Lambda-funktioner for at danne mere komplekse processer.
En vigtig egenskab ved Lambda-funktionen er imidlertid dens begrænsning med hensyn til behandlingstidsvarighed. Dette definerer i sidste ende, hvornår det er det rigtige formål at bruge AWS Lambda-funktionen.
Kilde: aws.amazon.com
Indholdsfortegnelse
Hvad er timeoutintervallet?
Timeout-funktionen i AWS Lambda-funktionen er en indstilling, der definerer den maksimale tid, som en funktion kan køre, før den afsluttes.
Lambda-funktioner er designet til at være kortvarige og statsløse, og det er sådan de skal bruges. Det er ikke en sjælden undtagelse at se, hvordan teams forsøger at bruge Lambda-funktionen til langvarige processer. Det gør de, bare fordi de ønsker at udnytte fordelene ved AWS Lambdas serverløse karakter. Det er altid meget billigere at køre en kode uden at det er nødvendigt at starte en server op med en bestemt CPU og hukommelseskonfiguration. Så hensigten er let at forstå.
Men hvis en funktion kører for længe, kan det forårsage problemer med ressourceudnyttelse og ydeevne. Du risikerer, at ressourcerne låser sig, og da du har fordelen af en langvarig proces, er du højst sandsynligt ligeglad med optimeringen af trinene inde i processerne. Pludselig er en ventetid på fem minutter ikke det store problem. Du har råd til at lade det være til stede, selvom det for selve processen kan være ubrugeligt.
Som standard er timeout for en Lambda-funktion indstillet til kun 3 sekunder. I så fald skal du regne med, at uanset hvilken kode du udfører inde i en Lambda-funktion skal afsluttes inden for tre sekunder. Dette er fantastisk, hvis du vil bygge en arkitektur med virkelig hurtig kommunikation og responstider, potentielt med millioner af transaktioner på meget kort tid. Men det ville begrænse de brugbare tilfælde af Lambda-funktion ganske betydeligt, så du kan øge denne grænse op til maksimalt 900 sekunder (15 minutter). Når denne timeout er nået, vil Lambda afslutte funktionen og returnere en fejlkode.
Hvordan konfigurerer man timeout-funktionen?
Kilde: aws.amazon.com
Du kan indstille timeout for en Lambda-funktion ved hjælp af AWS Management Console, AWS CLI eller AWS SDK’er.
Her er de konkrete trin til, hvordan du opnår dette:
Du kan også bruge AWS CLI-kommandolinjen til at opdatere timeout for en Lambda-funktion. Her er et eksempel på en kommando:
<code>aws lambda update-function-configuration --function-name [My_Lambda_Function_Name] --timeout 900
Denne kommando indstiller timeout for [My_Lambda_Function_Name] til 15 minutter. Indsæt blot dit rigtige navn på funktionen og den ønskede timeoutværdi i sekunder.
Nogle overvejelser
Timeout-indstillingen gælder for hele funktionen, ikke kun individuelle kodeblokke eller operationer i funktionen. Så hvis din funktion udfører en langvarig operation, såsom at behandle en stor fil eller lave en netværksanmodning, skal du sikre dig, at timeoutet stadig er nok til, at handlingen kan fuldføres, selv i det værste tilfælde .
Det er værd at bemærke, at Lambda-funktionerne er designet til at være kortvarige og statsløse. De er beregnet til at udføre små, diskrete opgaver. Hvis du oplever, at din Lambda-funktion tager lang tid at gennemføre, kan det være godt at overveje at dele den op i flere mindre funktioner. Du kan derefter ringe til dem én efter én med en udløser. For eksempel, hvis output fra den tidligere Lambda-funktion er gemt på en specifik S3-spand.
Derudover, hvis du har brug for at køre en langvarig proces, der overstiger 15-minutters grænsen, kan du overveje at bruge AWS Step Functions til at orkestrere en række Lambda-funktioner eller andre AWS-tjenester for at opnå dit ønskede resultat.
Bedste praksis
Arbejdsintervallet for selve timeoutet ser ikke ud til at være stort nok til nogle omfattende samtaler. Det meste af tiden ender udviklere med at sætte det op direkte til 15 minutter for alle Lambda-funktioner. Selvom funktionen ender meget hurtigere, er der ingen negativ bivirkning af det.
Ikke desto mindre er der stadig nogle bedste praksisser at bemærke.
#1. Definer passende værdi
Du bør indstille timeoutværdien baseret på den forventede udførelsestid for funktionen. Dette betyder grundlæggende at indstille en værdi, der ikke er for kort, men heller ikke unødvendigt lang.
Du vil måske sikre dig, at den samlede tid for en enkelt Lambda-funktion ikke er mere end tre minutter, for eksempel bare på grund af de arkitektoniske eller generelle ydelsesårsager til din applikation.
På samme måde vil du måske sikre dig, at Lambda-funktionen ikke afsluttes før, lad os sige, tre minutter. En af grundene kunne være, at du ønsker at udfylde et antal genforsøg i Lambda-koden. For eksempel, hvis nogle af de ressourcer, der er nødvendige for at færdiggøre koden, er optaget eller låst.
Så før du går videre og indstiller timeouten til 15 minutter, skal du overveje, hvad der kunne være den optimale værdi af eksekveringstid. At definere mere præcise værdier er blot endnu et værktøj til at give nogle grænser til hele udviklingsteamet.
#2. Overvågning over tid
Når du har indstillet timeout-grænserne, skal du gøre en indsats for at overvåge udførelsestiden for dine Lambda-funktioner. Dette vil give dig vigtig indsigt om, hvorvidt den oprindelige beslutning var rigtig eller har brug for nogle justeringer.
Du kan bruge CloudWatch-metrics og logfiler til at spore funktionernes udførelsestid. Identificer derefter dem, der tager længere tid end forventet, samt dem, der er meget hurtigere at fuldføre end forventet.
#3. Asynkron invokation
Hvis din Lambda-funktion udløses af en hændelse, der ikke kræver et øjeblikkeligt svar, for eksempel en filupload eller en besked fra en kø, skal du bruge asynkron påkaldelse for at reducere risikoen for timeouts. Dette vil få funktionen til at køre i baggrunden uden at vente på et svar. Dette kan naturligvis føre til et reduceret antal timeouts. Dette skyldes simpelthen, at du ikke behøver at inkludere den ventetid, som funktionen har brug for til den pågældende ressource i den samlede udførelsestid for Lambdaen.
#4. Brug trinfunktioner til komplekse processer
Hvis du har brug for at køre en langvarig proces, der overstiger 15-minutters grænsen, kan du bruge AWS Step Functions til at orkestrere en række Lambda-funktioner eller andre AWS-tjenester for at opnå dette resultat. Step Function vil opdele processen i mindre, mere håndterbare opgaver, som du kan udføre inden for timeoutgrænsen.
Du kan endda køre flere lambda-funktioner parallelt inden for en step-funktion. Lad derefter trinfunktionen vente på alle de parallelle lambda-funktioner, før du fortsætter videre. Dette er en form for horisontal skalering, hvor flere lambdafunktioner kan opdele et problem og løse det delvist sammen.
I sidste ende skal du bare samle de delresultater og opbygge den endelige opløsning, hvortil en efter den selvstændige lambda-funktion kan være tilstrækkelig.
#5. Optimer koden
Du kan optimere din Lambda-funktionskode for at reducere udførelsestiden og forbedre ydeevnen. Dette er nyttigt, hvis timeout-intervallet ikke er tilstrækkeligt kun lejlighedsvis. I så fald kan det være værd at søge efter kodeoptimering for at fjerne sådanne fejltilfælde.
Hvordan påvirker timeout på fakturering?
Kilde: aws.amazon.com
Timeout-indstillingen for en AWS Lambda-funktion påvirker ikke direkte faktureringen for funktionen. AWS Lambda fakturerer baseret på antallet af anmodninger og varigheden af funktionens eksekveringstid.
Hvis du øger timeout-indstillingen for en Lambda-funktion, kan det resultere i længere udførelsestider. Men kun hvis funktionen virkelig har brug for den ekstra tid. Hvis du kombinerer det med en højere frekvens af en funktion, der tager længere tid at udføre, så ja, du kan forvente højere omkostninger.
Men hvis funktionen ikke aktiveres ofte, eller hvis den fuldfører processen hurtigere, end timeoutværdien er nået, kan indvirkningen på faktureringen være minimal.
Det er derfor, at opsætning af alle Lambda-funktioner til en timeout på 15 minutter som standard måske ikke er hovedårsagen til stigningen i omkostningerne ved din samlede behandling.
Det fører dog bestemt til en indirekte stigning i de samlede omkostninger. Udviklere vil føle, at de har en vis reserve at bruge, og de optimerer måske ikke koden i en sådan grad, som de sandsynligvis ville gøre, hvis timeouts var mere restriktive, men stadig realistiske.
En anden ting er, at AWS Lambda tilbyder et gratis niveau, der inkluderer 1 million gratis anmodninger og 400.000 GB-sekunders regnetid om måneden. Hvis din brug af Lambda-funktion falder inden for grænserne for gratis niveau, betaler du ikke for funktionens udførelsestid uanset timeout-indstillingen.
Afsluttende ord
AWS Lambda-funktion er et kraftfuldt værktøj, især til serverløs behandling i AWS-skyen. Det har sit formål og sine grænser, som vi bør være opmærksomme på. Lad os ikke forsøge at bruge det til brugstilfælde, som det ikke er designet til.
Den er perfekt til enkle, asynkrone og ideelt udløste handlinger, der ikke kræver en eksekveringstid på mere end 15 minutter. Hvis du har brug for noget mere komplekst, kan du bruge AWS Step Functions til at kombinere flere Lambda-funktioner i en enkelt orkestreret proces. Eller opgiv billigere serverløs behandling og brug servere med passende konfiguration og computerkraft til at udføre din opgave.
Tjek derefter introduktionen til AWS Lambda for begyndere.