Najboljše prakse za ponovno uporabo kontejnerjev lambda AWS

Optimizacija toplih zagonov pri povezovanju AWS Lambda z drugimi storitvami

AWS Lambda zagotavlja visoko razširljivost, ker je brez strežnika in brez stanja, kar omogoča, da se številne kopije funkcije lambda sprožijo takoj (kot je opisano tukaj). Vendar boste verjetno med pisanjem prijavne kode želeli dostop do nekaterih pomembnih podatkov. To pomeni, da se povežete s podatkovno shrambo, kot sta na primer RDS ali S3. Vendar pa povezovanje z drugimi storitvami podjetja AWS Lambda doda čas k funkcijski kodi. Obstajajo lahko tudi stranski učinki visoke razširljivosti, na primer doseganje največjega števila dovoljenih povezav do primerka RDS. Ena od možnosti za preprečitev tega je uporaba ponovne uporabe posode v AWS Lambda, da vztrajate v povezavi in ​​skrajšate čas delovanja lambde.

Tu je nekaj uporabnih diagramov, ki pojasnjujejo življenjski cikel zahteve lambda.

Med hladnim zagonom se zgodi, da se funkcija prvič pokliče ali po obdobju neaktivnosti:

  • Koda in odvisnosti se prenesejo.
  • Zažene se nov zabojnik.
  • Čas izvajanja se zažene.

Končno dejanje je zagon kode, kar se zgodi vsakič, ko se prikliče funkcija lambda. Če vsebnik ponovno uporabimo za poznejši klic funkcije lambda, lahko pred začetkom kode preskočimo naprej. Temu pravimo topel začetek in to je korak, ki ga lahko optimiziramo pri povezovanju z drugimi storitvami tako, da določimo povezavo zunaj obsega metode obdelave.

Povezava z drugimi AWS storitvami podjetja Lambda

Primer: Povežite se z primerom RDS, od koder prihaja ikona AWS

Imamo osnovni in pogost primer, ki ga je treba voditi - želimo se povezati z viri zabojnika in pridobiti podatke o obogatitvi. V tem primeru pride uporabna obremenitev JSON z ID-jem in funkcija Lambda se poveže z primerom RDS, ki poganja PostgreSQL, da poišče ustrezno ime ID-ja, da lahko vrnemo obogateno koristno obremenitev. Ker se lambda funkcija povezuje z RDS, ki živi v VPC-ju, mora funkcija lambda zdaj živeti tudi v zasebni podomreži. To doda nekaj korakov k hladnemu začetku - treba je priključiti elastični omrežni vmesnik VPC (ENI) (kot je omenjeno v blogu Jeremyja Dalyja, to doda čas za vaše hladne začetke).

Opomba: če bi uporabili shrambo ključa / vrednosti z DynamoDB namesto RDS, bi se lahko izognili uporabi VPC.

Preučil bom dve rešitvi te naloge, prva je moja 'naivna' rešitev, medtem ko druga rešitev optimizira za tople začetne čase s ponovno uporabo povezave za poznejše priklice. Nato bomo primerjali uspešnost vsake rešitve.

Možnost 1 - Povežite se z RDS znotraj upravljalnika

Ta primer kode prikazuje, kako bi lahko naivno pristopil k tej nalogi - povezava z bazo podatkov je znotraj načina obdelave. Obstaja preprosta izbirna poizvedba za pridobitev imena ID-ja, preden vrnete uporabno obremenitev, ki zdaj vključuje ime.

Poglejmo, kako deluje ta možnost med manjšim testom s skokom 2000 priklic s sočasnostjo 20. Najmanjše trajanje je 18 ms s povprečjem 51 ms in nekaj več kot 1 sekundo (trajanje hladnega zagona).

Trajanje lambde

Spodnji graf kaže, da je do baze podatkov največ osem povezav.

Število povezav do baze podatkov RDS v 5-minutnem oknu.

Možnost 2 - uporabite globalno povezavo

Druga možnost je, da povezavo definiramo kot globalno zunaj metode obdelave. Nato v uporabniku dodamo ček, da preverimo, ali povezava obstaja, in povežemo le, če ne. To pomeni, da se povezava izvede samo enkrat na posodo. Če na ta način nastavite povezavo s pogojno nameščenim, pomeni, da nam ni treba vzpostaviti povezave, če to ne zahteva logika kode.

Povezave z bazo podatkov ne prekinemo več, zato ostane povezava za poznejši priklic funkcije. Ponovna uporaba povezave znatno zmanjša trajanje toplega zagona - povprečno trajanje je približno 3-krat hitrejše, najmanjše pa 1 ms, ne pa 18 ms.

Lambda Durations

Povezava z primerom RDS je zamudna naloga in ni nujno, da se povežete z vsakim prizivom, koristno je za uspešnost. Pri povezovanju z bazo podatkov z enostavno poizvedbo baze podatkov dosežemo največje število povezav do baze podatkov 20, kar ustreza ravni sočasnosti (naredili smo 20 hkratnih priklic x 100-krat). Ko se prekinitev priklicev ustavi, se povezave postopoma zaprejo.

Zdaj, ko je AWS povečal dovoljeno trajanje lambde na 15 minut, to pomeni, da bi povezave z bazo podatkov lahko trajale dlje in bi lahko bili v nevarnosti, da bi dosegli največjo povezavo RDS. Privzete maks. Povezave je mogoče prepisati v nastavitvah skupine parametrov RDS, čeprav povečanje največjega števila povezav lahko povzroči težave z dodelitvijo pomnilnika. Manjši primerki imajo lahko privzeto vrednost max_connections manjšo od 100. Upoštevajte te omejitve in dodajte samo logiko aplikacije, da se povežete z bazo podatkov, kadar je to potrebno.

Uporaba globalne povezave za druge naloge

Lambda Povezava s S3

Skupna naloga, ki jo bomo morda morali opraviti z Lambda, je dostop do podatkov o stanju države S3. Spodaj je prikazan delček kode, ki je na voljo s programsko opremo AWS Python Lambda Function - po kateri se lahko pomikate tako, da se prijavite v konzolo AWS in kliknete tukaj. V kodi lahko vidite, da je odjemalec S3 popolnoma definiran zunaj upravljavca, ko se vsebnik inicializira, medtem ko je bil za primer RDS globalna povezava nastavljena znotraj upravljavca. Oba pristopa bosta določila globalne spremenljivke, ki bodo omogočale, da bodo na voljo za poznejše priklice.

odsek kode osnutka kode lambda s3-get-object https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

Dešifriranje spremenljivk okolja

Lambda konzola vam daje možnost šifriranja spremenljivk okolja za dodatno varnost. Naslednji delček kode je primer AWS, ki nudi Java pomočnik skripta za dešifriranje spremenljivk okolja iz funkcije Lambda. Do delčka kode se lahko pomaknete tako, da sledite tej vadnici (natančneje 6. korak). Ker je DECRYPTED_KEY definiran kot razred global, se funkcija in logika decryptKey () pokličeta samo enkrat na lambda vsebnik. Zato bomo videli občutno izboljšanje trajanja toplega zagona.

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

Uporaba globalnih spremenljivk v drugih FaaS rešitvah

Ta pristop ni izoliran AWS Lambda. Način uporabe globalne povezave je mogoče uporabiti tudi za brez strežniške funkcije drugih ponudnikov oblakov. Stran z nasveti in nasveti za Google Cloud Functions ponuja dobro razlago spremenljivk, ki niso lene (kadar je spremenljivka vedno inicializirana zunaj metode obdelave) in lenih spremenljivk (globalna spremenljivka je nastavljena le, kadar je potrebno) globalnih spremenljivk.

Druge najboljše prakse

Tu je še nekaj najboljših praks, ki jih morate upoštevati.

Testiranje

Uporaba FaaS omogoča arhitekturo mikroservisov. Z majhnimi, diskretnimi deli funkcionalnosti gre z roko v roki z učinkovitim testiranjem enot. Za pomoč pri testiranju enote:

  • Ne pozabite izključiti testnih odvisnosti iz paketa lambda.
  • Ločeno logiko ločite od metode obdelave, kot bi to storili z glavno metodo programa.

Odvisnosti in velikost paketa

Zmanjšanje velikosti paketa za uvajanje pomeni, da bo prenos kode hitrejši pri inicializaciji in bo zato izboljšal vaše hladne začetne čase. Odstranite neuporabljene knjižnice in mrtvo kodo, da zmanjšate velikost datoteke ZIP datoteke. AWS SDK je na voljo za izvajalne programe Python in JavaScript, zato jih ni treba vključevati v vaš paket uvajanja.

Če je Node.js vaš najprimernejši čas izvajanja Lambda, lahko uporabite minifikacijo in uglifikacijo, da zmanjšate velikost svoje funkcijske kode in zmanjšate velikost vašega uvajalnega paketa. Nekatere, vendar ne vse vidike minimiziranja in uglifikacije je mogoče uporabiti za druge čase izvajanja, npr. ne morete odstraniti praznega prostora iz kode python, lahko pa odstranite komentarje in skrajšate imena spremenljivk.

Nastavitev pomnilnika

Preizkusite, da bi našli optimalno količino pomnilnika za funkcijo Lambda. Plačate dodelitev pomnilnika, zato podvojitev pomnilnika pomeni, da morate plačati dvojno na milisekundo; vendar se zmogljivost izračuna izračuna z dodeljenim pomnilnikom, tako da bi lahko čas delovanja zmanjšal na manj kot polovico tega, kar je bil. Obstaja že nekaj uporabnih orodij za izbiro optimalne nastavitve pomnilnika za vas, kot je ta.

Za zaključek…

Pomembno je upoštevati, ali je uporaba metode ponovne povezave potrebna. Če se vaša lambda funkcija prikliče le redko, na primer enkrat na dan, potem ne boste imeli koristi od optimizacije za tople začetke. Pogosto lahko pride do kompromisov med optimizacijo uspešnosti v primerjavi z berljivostjo kode - izraz "uglifikacija" govori sam zase! Poleg tega dodajanje globalnih spremenljivk v kodo za ponovno uporabo povezav z drugimi storitvami lahko vašo kodo oteži sledenje. Na misel mi prideta dve vprašanji:

  • Bo novi član ekipe razumel vašo kodo?
  • Ali boste lahko s svojo ekipo v prihodnosti odpravili kodo?

Verjetno pa ste izbrali Lambda za njen obseg in želite visoke zmogljivosti in nizke stroške, zato poiščite ravnotežje, ki ustreza potrebam vaše ekipe.

Ta mnenja so avtorjeva mnenja. Če v tej objavi ni drugače navedeno, Capital One ni povezan z nobeno od omenjenih družb. Vse blagovne znamke in druge intelektualne lastnine, ki se uporabljajo ali prikazujejo, so last lastnih lastnikov. Ta članek je © 2019 Capital One.