Osvedčené postupy pre opakované použitie kontajnera AWS Lambda

Optimalizácia teplých štartov pri pripojení AWS Lambda k iným službám

AWS Lambda poskytuje vysokú škálovateľnosť vďaka tomu, že nemá server a je bez štátnej príslušnosti, čo umožňuje okamžité vytvorenie mnohých kópií funkcie lambda (ako je opísané tu). Pri písaní kódu aplikácie však pravdepodobne budete chcieť získať prístup k niektorým stavovým údajom. To znamená pripojenie k dátovému úložisku, ako je napríklad inštancia RDS alebo S3. Pripojením k iným službám od spoločnosti AWS Lambda sa však vášmu funkčnému kódu pridá čas. Môžu sa vyskytnúť aj vedľajšie účinky vyplývajúce z vysokej škálovateľnosti, napríklad dosiahnutie maximálneho počtu povolených pripojení k inštancii RDS. Jednou z možností, ako tomu zabrániť, je použitie opakovaného použitia kontajnerov v AWS Lambda na pretrvávanie spojenia a skrátenie doby prevádzky lambda.

Existuje niekoľko užitočných diagramov, ktoré vysvetľujú životný cyklus žiadosti o lambdu.

Počas studeného štartu, keď je vaša funkcia vyvolaná prvýkrát alebo po určitej dobe nečinnosti, nastáva toto:

  • Kód a závislosti sa stiahnu.
  • Spustí sa nový kontajner.
  • Runtime je spustené.

Poslednou akciou je spustenie kódu, ku ktorému dochádza pri každom vyvolaní funkcie lambda. Ak sa kontajner znovu použije na následné vyvolanie funkcie lambda, môžeme preskočiť na začiatok kódu. Toto sa nazýva teplý štart a toto je krok, ktorý môžeme optimalizovať pri pripájaní k iným službám definovaním pripojenia mimo rozsahu metódy obsluhy.

Pripája sa k iným službám AWS z Lambda

Príklad: Pripojte sa k inštancii RDS, odtiaľto pochádzajú ikony AWS

Máme základný a bežný príklad, cez ktorý sa chceme spustiť - chceme sa pripojiť k prostriedku kontajnera a načítať údaje o obohatení. V tomto príklade sa užitočné zaťaženie JSON dodáva s ID a funkcia Lambda sa pripája k inštancii RDS, na ktorej beží PostgreSQL, aby našla zodpovedajúce meno ID, aby sme mohli vrátiť obohatené užitočné zaťaženie. Pretože funkcia lambda sa pripája k RDS, ktorý žije vo VPC, funkcia lambda teraz musí žiť aj v súkromnej podsieti. Toto pridáva niekoľko krokov k štartu za studena - je potrebné pripojiť elastické sieťové rozhranie VPC (ENI) (ako je uvedené v blogu Jeremyho Dalyho, tým sa pridáva čas na váš štart za studena).

Poznámka: Ak by sme používali úložisko kľúčov a hodnôt s DynamoDB namiesto RDS, mohli by sme sa vyhnúť používaniu VPC.

Prejdem dve riešenia tejto úlohy, prvé je moje „naivné“ riešenie, zatiaľ čo druhé riešenie sa optimalizuje pre teplé štartovacie časy opätovným použitím pripojenia pre následné vyvolania. Potom porovnáme výkon každého riešenia.

Možnosť 1 - Pripojte sa k RDS v rámci obsluhy

Tento príklad kódu ukazuje, ako by som mohol k tejto úlohe pristupovať naivne - pripojenie k databáze je v rámci metódy obsluhy. Pred vrátením užitočného zaťaženia, ktorý teraz obsahuje názov, existuje jednoduchý výberový dotaz na získanie názvu ID.

Pozrime sa, ako táto možnosť funguje pri malom teste s výbojom 2 000 hovorov so súbežnosťou 20. Minimálne trvanie je 18 ms s priemerom 51 ms a maximálne viac ako 1 s (trvanie studeného štartu).

Trvanie Lambda

Nasledujúci graf ukazuje, že existuje maximálne osem pripojení k databáze.

Počet pripojení k databáze RDS v 5-minútovom okne.

Možnosť 2 - Použite globálne pripojenie

Druhou možnosťou je definovať pripojenie ako globálne mimo metódy obsluhy. Potom v rámci obsluhy pridáme kontrolu, aby sme zistili, či existuje spojenie, a pripojíme sa, iba ak nie. To znamená, že spojenie sa vytvorí iba raz na nádobu. Takto nastavené spojenie so zavedeným podmienením znamená, že nepotrebujeme pripojenie, ak to nevyžaduje logika kódu.

Už neuzavierame pripojenie k databáze, takže pripojenie zostáva pre následné vyvolanie funkcie. Opätovné použitie spojenia výrazne skracuje trvanie teplého štartu - priemerné trvanie je približne 3-krát rýchlejšie a minimum je 1 ms namiesto 18 ms.

Trvanie Lambda

Pripojenie k inštancii RDS je časovo náročná úloha a nemusíte sa pripájať pri každom vyvolaní, je to pre výkon výhodné. Pri pripájaní sa k databáze pre jednoduchý databázový dopyt dosiahneme maximálny počet databázových pripojení 20, ktorý zodpovedá úrovni súbežnosti (vykonali sme 20 súbežných volaní x 100 krát). Po zastavení vzplanutí sa spojenia postupne uzavrú.

Teraz, keď spoločnosť AWS zvýšila povolenú dĺžku trvania lambda na 15 minút, znamená to, že pripojenie k databáze by mohlo trvať dlhšie a mohlo by vám hroziť dosiahnutie maximálneho počtu pripojení RDS. Predvolené maximálne pripojenia sa dajú prepísať v nastaveniach skupiny parametrov RDS, aj keď zvýšenie maximálneho počtu pripojení by mohlo mať za následok problémy s pridelením pamäte. Menšie inštancie môžu mať predvolenú hodnotu max_connections menšiu ako 100. Pamätajte na tieto limity a logiku aplikácie pridajte iba na pripojenie k databáze v prípade potreby.

Použitie globálneho pripojenia na iné úlohy

Lambda Pripojenie k S3

Spoločnou úlohou, ktorú by sme mohli potrebovať s Lambda, je prístup k stavovým údajom z S3. Útržok kódu uvedený nižšie predstavuje plán funkcie Python Lambda Function poskytovaný AWS - ku ktorému sa môžete prihlásiť po prihlásení sa do konzoly AWS a kliknutím sem. V kóde môžete vidieť, že klient S3 je pri inicializácii kontajnera úplne definovaný mimo obslužného programu, zatiaľ čo v prípade RDS bolo globálne pripojenie nastavené v obslužnom prostriedku. Oba prístupy stanovia globálne premenné, ktoré im umožnia prístup k následným vyvolaniam.

Útržok kódu s modrým kódom lambda s3-get-object https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

Dešifrovacie premenné prostredia

Konzola lambda vám poskytuje možnosť šifrovania premenných prostredia kvôli vyššej bezpečnosti. Nasledujúci útržok kódu je príkladom Java poskytovaného skriptom AWS pomocného skriptu na dešifrovanie premenných prostredia z Lambda funkcie. Útržok kódu môžete prejsť podľa tohto návodu (konkrétne krok 6). Pretože DECRYPTED_KEY je definovaný ako globálny trieda, funkcia decryptKey () a logika sa volajú iba raz na kontajner lambda. Uvidíme preto výrazné zlepšenie v trvaní teplého štartu.

https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions and https://docs.aws.amazon.com/lambda/latest/dg/tutorial-env_console.html

Využívanie globálnych premenných v iných riešeniach FaaS

Tento prístup nie je izolovaný od AWS Lambda. Spôsob použitia globálneho pripojenia je možné použiť aj na funkcie servera iných poskytovateľov cloudu. Stránka s tipmi a trikmi funkcie Google Cloud Functions poskytuje dobré vysvetlenie pre nelineárne premenné (keď je premenná vždy inicializovaná mimo metódy manipulátora) verzus lenivé premenné (globálna premenná je nastavená iba v prípade potreby) globálne premenné.

Ďalšie osvedčené postupy

Tu je niekoľko ďalších osvedčených postupov, ktoré treba mať na pamäti.

testovanie

Používanie FaaS uľahčuje architektúru mikroprocesov. A s malými, diskrétnymi funkciami ide ruka v ruke s účinným testovaním jednotiek. Ako pomôcku pri testoch jednotiek:

  • Nezabudnite vylúčiť testovacie závislosti z balíka lambda.
  • Oddeľte logiku od metódy obsluhy, ako by to bolo pri hlavnej metóde programu.

Závislosti a veľkosť balenia

Zmenšenie veľkosti balíka nasadenia znamená, že sťahovanie kódu bude pri inicializácii rýchlejšie, a preto zlepší vaše chladné časy začiatku. Odstráňte nepoužívané knižnice a mŕtvy kód, aby ste zmenšili veľkosť súboru ZIP umiestnenia. Sada AWS SDK je poskytovaná pre runtime Python a JavaScript, takže ich nemusíte zahrnúť do balíka nasadenia.

Ak je Node.js preferovanou runtime verziou Lambda, môžete použiť minifikáciu a uglifikáciu, aby ste zmenšili veľkosť kódu vašej funkcie a minimalizovali veľkosť vášho balíka nasadenia. Niektoré, ale nie všetky aspekty minifikácie a uglifikácie, sa dajú aplikovať na ďalšie runtime, napr. z pythonového kódu nemôžete odstrániť medzeru, ale môžete odstrániť komentáre a skrátiť názvy premenných.

Nastavenie pamäte

Experimentujte, aby ste našli optimálne množstvo pamäte pre Lambda funkciu. Platíte za pridelenie pamäte, takže zdvojnásobenie pamäte znamená, že musíte platiť dvojnásobok za milisekundu; ale výpočtová kapacita sa zvyšuje s alokovanou pamäťou, aby mohla potenciálne skrátiť dobu prevádzky na menej ako polovicu toho, čo to bolo. Už existuje niekoľko užitočných nástrojov na výber optimálneho nastavenia pamäte, ako je toto.

Uzavrieť…

Jednu vec je potrebné zvážiť, či je potrebné použiť metódu opätovného použitia pripojenia. Ak sa vaša funkcia lambda spúšťa iba zriedka, napríklad raz denne, nebudete mať z optimalizácie pre teplé štartovanie úžitok. Často existuje kompromis medzi optimalizáciou výkonu a čitateľnosťou kódu - výraz „uglifikácia“ hovorí sám za seba! Okrem toho pridanie globálnych premenných do kódu na opätovné použitie pripojení k iným službám môže potenciálne sťažiť sledovanie vášho kódu. Prichádza na myseľ dve otázky:

  • Rozumie nový člen tímu vášmu kódu?
  • Dokážete vy a váš tím v budúcnosti tento kód ladiť?

Je však pravdepodobné, že ste si vybrali Lambdu pre jej rozsah a chcete vysoký výkon a nízke náklady, takže nájdite rovnováhu, ktorá vyhovuje potrebám vášho tímu.

Tieto názory sú názormi autora. Pokiaľ nie je v tomto príspevku uvedené inak, spoločnosť Capital One nie je pridružená ani podporovaná žiadnou z uvedených spoločností. Všetky použité alebo zobrazené ochranné známky a iné duševné vlastníctvo sú vlastníctvom príslušných vlastníkov. Tento článok je © 2019 Capital One.