Geriausia „AWS Lambda“ konteinerių pakartotinio naudojimo praktika

Šiltos pradžios optimizavimas prijungiant „AWS Lambda“ prie kitų paslaugų

Dėl „AWS Lambda“ yra didelis mastelio keitimas dėl to, kad jis neturi serverio ir neturi jokios būklės, todėl daugelį „lambda“ funkcijos egzempliorių galima sukurti iškart (kaip aprašyta čia). Tačiau rašydami programos kodą greičiausiai norėsite gauti prieigą prie kai kurių teisingų duomenų. Tai reiškia prisijungimą prie duomenų saugyklos, tokios kaip RDS egzempliorius ar S3. Tačiau prisijungimas prie kitų „AWS Lambda“ paslaugų prideda laiko jūsų funkcijos kodui. Didelis mastelio augimas taip pat gali turėti šalutinį poveikį, pavyzdžiui, pasiekti maksimalų leidžiamą jungčių skaičių prie RDS egzemplioriaus. Viena iš būdų tai panaikinti yra pakartotinis konteinerio naudojimas „AWS Lambda“, kad būtų išlaikytas ryšys ir sumažintas „lambda“ veikimo laikas.

Čia yra keletas naudingų schemų, paaiškinančių „lambda“ užklausos gyvavimo ciklą.

Šaltojo paleidimo metu, kai jūsų funkcija įjungiama pirmą kartą arba po neveiklumo, įvyksta:

  • Kodas ir priklausomybės yra atsisiųsti.
  • Paleidžiamas naujas konteineris.
  • Įvykdymo laikas paleidžiamas.

Paskutinis veiksmas yra paleisti savo kodą, kuris įvyksta kiekvieną kartą, kai įjungiama „lambda“ funkcija. Jei konteineris bus pakartotinai panaudotas, kad vėliau būtų galima sušaukti „lambda“ funkciją, galime pereiti į priekį ir pradėti kodą. Tai vadinama šilta pradžia, ir tai yra žingsnis, kurį galime optimizuoti prisijungdami prie kitų paslaugų, apibrėždami ryšį, kuris nepatenka į prižiūrėtojo metodo taikymo sritį.

Prisijungimas prie kitų „Lambda“ AWS paslaugų

Pavyzdys: prisijunkite prie RDS egzemplioriaus, čia pateikiamos AWS piktogramos

Turime pagrindinį ir bendrą pavyzdį, kurį reikia paleisti - norime prisijungti prie konteinerio išteklių, kad gautume praturtėjimo duomenis. Šiame pavyzdyje JSON naudingoji apkrova pateikiama su ID, o „Lambda Function“ jungiasi su RDS egzemplioriumi, kuriame veikia PostgreSQL, kad rastų atitinkamą ID pavadinimą, kad galėtume grąžinti praturtintą naudingą krovinį. Kadangi „lambda“ funkcija jungiasi prie RDS, kuri gyvena VPC, dabar „lambda“ funkcija turi gyventi ir privačiame potinklyje. Tai prideda keletą žingsnių prie šaltojo starto - reikia prisegti VPC elastinę tinklo sąsają (ENI) (kaip minėta Jeremy Daly tinklaraštyje, tai prideda laiko jūsų šaltajam startui).

Pastaba: jei išvengtume rakto / vertės saugyklos su „DynamoDB“, o ne RDS, galėtume vengti naudoti VPC.

Apžvelgsiu du šios užduoties sprendimus, pirmasis yra mano „naivus“ sprendimas, o antrasis sprendimas optimizuoja šilto pradžios laiką, pakartotinai naudodamas ryšį vėlesniems kvietimams. Tada palyginsime kiekvieno sprendimo našumą.

1 variantas - Prijunkite prie RDS tvarkyklėje

Šis kodo pavyzdys parodo, kaip aš galiu naiviai kreiptis į šią užduotį - duomenų bazės ryšys yra tvarkiklio metodas. Yra paprasta užklausa, kad būtų galima gauti ID pavadinimą prieš grąžinant naudingą krovinį, kuriame dabar yra ir vardas.

Pažiūrėkime, kaip ši parinktis veikia mažo testo metu, kai buvo sušaukta 2000 kvietimų ir 20 kartu. Minimali trukmė yra 18 ms, vidutiniškai 51 ms, o maksimaliai daugiau nei 1 sekundė (šaltojo paleidimo trukmė).

Lambda trukmė

Žemiau pateiktoje schemoje parodyta, kad yra ne daugiau kaip aštuoni prisijungimai prie duomenų bazės.

Ryšių su RDS duomenų baze skaičius per 5 minutes.

2 variantas - naudokite visuotinį ryšį

Antrasis variantas yra apibrėžti ryšį kaip visuotinį apdorojimo metodo ribų. Tada prižiūrėtojo viduje pridedame čekį, kad pamatytume, ar nėra ryšio, ir jungiame tik tada, kai jo nėra. Tai reiškia, kad vienas konteineris yra užmezgamas tik vieną kartą. Tokiu būdu nustatant ryšį su sąlygine vieta reiškia, kad mums nereikia užmegzti ryšio, jei to nereikalauja kodo logika.

Mes nebeuždarome ryšio su duomenų baze, todėl ryšys išlieka vėlesniam funkcijos kvietimui. Pakartotinis ryšio naudojimas žymiai sumažina šiltojo užvedimo trukmę - vidutinė trukmė yra maždaug 3 kartus greitesnė, o mažiausia - 1 ms, o ne 18 ms.

Lambda trukmės

Prisijungimas prie RDS egzemplioriaus yra daug laiko reikalaujanti užduotis, todėl neprivaloma prisijungti prie kiekvieno kvietimo. Prisijungdami prie duomenų bazės, norėdami atlikti paprastą duomenų bazės užklausą, pasiekiame maksimalų 20 duomenų bazės jungčių skaičių, kuris atitiktų lygiavertiškumo lygį (mes atlikome 20 vienu metu atliekamų kvietimų x 100 kartų). Kai suskambių paskambinimai nutrūksta, ryšiai palaipsniui uždaromi.

Dabar, kai AWS padidino „lambda“ trukmės pašalpą iki 15 minučių, tai reiškia, kad duomenų bazių jungtys gali trukti ilgiau ir jums gali kilti pavojus pasiekti RDS max jungčių numerį. Numatytuosius maksimalius ryšius galima perrašyti RDS parametrų grupės parametruose, nors padidinus maksimalų jungčių skaičių gali kilti problemų dėl atminties paskirstymo. Mažesnių egzempliorių numatytoji „max_connections“ vertė gali būti mažesnė nei 100. Atminkite šiuos apribojimus ir pridėkite programos logiką, kad prireikus prisijungtumėte prie duomenų bazės.

Visuotinio ryšio naudojimas kitoms užduotims

Lambda prijungimas prie S3

Bendra užduotis, kurią mums gali reikėti atlikti su „Lambda“, yra prieiga prie valstybinių S3 duomenų. Kodo fragmentas yra AWS pateiktas „Python Lambda Function“ brėžinys - į kurį galite pereiti prisijungę prie AWS konsolės ir spustelėję čia. Kode galite pamatyti, kad S3 klientas yra visiškai apibrėžtas tvarkyklės išorėje, kai inicializuojamas konteineris, o RDS pavyzdyje globali jungtis buvo nustatyta tvarkyklės viduje. Abu būdai nustatys globaliuosius kintamuosius, leidžiančius jiems būti prieinamiems vėliau.

„s3-get-object“ „lambda“ projekto kodo fragmentas https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

Aplinkos kintamųjų iššifravimas

„Lambda“ konsolė suteikia galimybę užšifruoti aplinkos kintamuosius papildomam saugumui. Šis kodo fragmentas yra AWS pateiktas „Java“ pagalbinio scenarijaus pavyzdys, kaip iššifruoti aplinkos kintamuosius iš funkcijos „Lambda“. Galite pereiti prie kodo fragmento vykdydami šią mokymo programą (ypač 6 veiksmą). Kadangi DECRYPTED_KEY yra apibrėžiamas kaip klasės visuma, funkcija decryptKey () ir logika vienu lambda konteineriu vadinama tik vieną kartą. Todėl pastebėsime, kad šilto starto trukmė žymiai pagerės.

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

Visuotinių kintamųjų naudojimas kituose „FaaS“ sprendimuose

Šis požiūris nėra išskirtinis „AWS Lambda“ atžvilgiu. Visuotinio ryšio naudojimo metodas taip pat gali būti taikomas ir kitoms debesijos tiekėjų funkcijoms be serverio. „Google“ debesų funkcijų patarimų ir patarimų puslapis pateikia gerą paaiškinimą ne tinginiams kintamiesiems (kai kintamasis visada yra inicializuojamas ne pagal tvarkiklio metodą), palyginti su tingiems kintamiesiems (globalus kintamasis nustatomas tik tada, kai reikia), globaliems kintamiesiems.

Kita geriausia praktika

Čia yra keletas geriausių praktinių pavyzdžių, kuriuos reikia atsiminti.

Testavimas

Naudojant „FaaS“ yra lengviau sukurti mikro paslaugų architektūrą. O mažų, diskretiškų funkcijų įgijimas yra neatsiejamas nuo efektyvaus įrenginio testavimo. Norėdami palengvinti vieneto testus:

  • Nepamirškite iš „lambda“ pakuotės pašalinti priklausomybes nuo bandymo.
  • Atskirkite logiką nuo tvarkyklės metodo, kaip tai darytumėte su pagrindiniu programos metodu.

Priklausomybės ir paketo dydis

Sumažinus diegimo paketo dydį, kodas bus atsisiunčiamas greičiau paleidžiant, todėl pagerės šaltojo paleidimo laikas. Pašalinkite nenaudojamas bibliotekas ir negyvą kodą, kad sumažintumėte diegimo ZIP failo dydį. „AWS SDK“ teikiama „Python“ ir „JavaScript“ veikimo laikams, todėl nereikia jų įtraukti į diegimo paketą.

Jei „Node.js“ yra jūsų pasirinktas „Lambda“ vykdymo laikas, galėtumėte pritaikyti mažinimą ir aglifikaciją, kad sumažintumėte savo funkcijos kodą ir sumažintumėte diegimo paketo dydį. Kai kuriuos, bet ne visus, minifikacijos ir aglifikacijos aspektus galima pritaikyti ir kitoms veikimo eigoms, pvz. jūs negalite pašalinti tarpo iš python kodo, bet galite pašalinti komentarus ir sutrumpinti kintamųjų pavadinimus.

Atminties nustatymas

Eksperimentuokite, norėdami rasti optimalų „Lambda Function“ atminties kiekį. Jūs mokate už atminties paskirstymą, todėl dvigubai padidėjant atminčiai, jūs turite mokėti dvigubai už milisekundę; tačiau apskaičiuotoji talpa padidėja su paskirta atmintimi, taigi ji gali sumažinti veikimo laiką iki mažiau nei pusės to, koks jis buvo. Jau yra keletas naudingų įrankių, kaip pasirinkti jums optimalų atminties parametrą.

Baigti ...

Reikia atsižvelgti į tai, ar būtina naudoti pakartotinio ryšio metodą. Jei jūsų lambda funkcija naudojama tik nedažnai, pavyzdžiui, kartą per dieną, jums nebus naudinga optimizuoti šiltuosius startus. Dažnai reikia kompensuoti optimizavimą našumui ir jūsų kodo skaitomumui - terminas „uglifikacija“ pats savaime suprantamas! Be to, pridėję prie savo kodų globalius kintamuosius, kad pakartotinai panaudotumėte ryšius su kitomis paslaugomis, jūsų kodą gali būti sunkiau atsekti. Galvoja du klausimai:

  • Ar naujas komandos narys supras jūsų kodą?
  • Ar jūs ir jūsų komanda ateityje galėsite derinti kodą?

Tačiau gali būti, kad pasirinkote „Lambda“ savo mastu ir norite aukšto našumo bei mažų išlaidų, todėl raskite pusiausvyrą, atitinkančią jūsų komandos poreikius.

Šios nuomonės yra tos pačios autorės. Jei šiame pranešime nenurodyta kitaip, „Capital One“ nėra susijusi ir nėra palaikoma nė vienos iš paminėtų bendrovių. Visi naudojami ar rodomi prekių ženklai ir kita intelektinė nuosavybė priklauso jų savininkams. Šis straipsnis yra © 2019 „Capital One“.