Labākā prakse AWS Lambda konteineru atkārtotai izmantošanai

Siltu sākumu optimizēšana, savienojot AWS Lambda ar citiem pakalpojumiem

AWS Lambda nodrošina augstu mērogojamību, jo tā ir bez servera un bez valsts, ļaujot daudzām lambda funkcijas kopijām uzreiz parādīties (kā aprakstīts šeit). Tomēr, rakstot pieteikuma kodu, jūs, iespējams, vēlēsities piekļūt dažiem valsts datiem. Tas nozīmē savienojumu ar datu krātuvi, piemēram, RDS instanci vai S3. Tomēr savienojums ar citiem pakalpojumiem no AWS Lambda papildina jūsu funkcijas kodu. Augsta mērogojamība var izraisīt arī blakusparādības, piemēram, sasniegt maksimālo atļauto savienojumu skaitu ar RDS instanci. Viena no iespējām, kā to novērst, ir izmantot konteineru atkārtotu izmantošanu AWS Lambda, lai saglabātu savienojumu un samazinātu lambda darbības laiku.

Šeit ir dažas noderīgas diagrammas, kas izskaidro lambda pieprasījuma dzīves ciklu.

Aukstā starta laikā, kad pirmo reizi tiek izsaukta jūsu funkcija vai pēc neaktivitātes perioda, notiek šādi gadījumi:

  • Tiek lejupielādēts kods un atkarības.
  • Tiek sākts jauns konteiners.
  • Runtime tiek sāknēta.

Pēdējā darbība ir jūsu koda palaišana, kas notiek katru reizi, kad tiek izsaukta lambda funkcija. Ja konteiners tiek atkārtoti izmantots turpmākai lambda funkcijas piesaukšanai, mēs varam pāriet uz priekšu, lai sāktu kodu. To sauc par siltu sākumu, un tas ir solis, ko varam optimizēt, izveidojot savienojumu ar citiem pakalpojumiem, nosakot savienojumu ārpus hendlera metodes darbības jomas.

Savienojuma izveide ar citiem AWS pakalpojumiem no Lambda

Piemērs: izveidojiet savienojumu ar RDS gadījumu, no šejienes iegūtas AWS ikonas

Mums ir pamata un parasts piemērs, kas jāizpilda - mēs vēlamies izveidot savienojumu ar konteinera resursu, lai iegūtu bagātināšanas datus. Šajā piemērā JSON krava tiek piegādāta ar ID, un funkcija Lambda savienojas ar RDS instanci, kurā darbojas PostgreSQL, lai atrastu atbilstošo ID nosaukumu, lai mēs varētu atgriezt bagātinātu derīgo kravu. Tā kā lambda funkcija savienojas ar RDS, kas dzīvo VPC, lambda funkcijai tagad jādzīvo arī privātā apakštīklā. Tas aukstās palaišanas laikā palielina pāris soļu - ir jāpievieno VPC elastīgais tīkla interfeiss (ENI) (kā minēts Džeremija Dalija emuārā, tas palielina laiku jūsu aukstajam startam).

Piezīme: mēs varētu izvairīties no VPC lietošanas, ja atslēgas / vērtības krātuvi izmantotu ar DynamoDB, nevis RDS.

Es apskatīšu divus šī uzdevuma risinājumus, pirmais ir mans “naivais” risinājums, turpretī otrais risinājums optimizē silto starta laiku, atkārtoti izmantojot savienojumu nākamajiem izsaukumiem. Tad mēs salīdzināsim katra risinājuma veiktspēju.

1. variants - izveidojiet savienojumu ar RDS apstrādātājā

Šis koda piemērs parāda, kā es varētu naivi vērsties pie šī uzdevuma - datu bāzes savienojums atrodas apstrādātāja metodē. Lai atgrieztu ID nosaukumu pirms kravas atgriešanas, kurā tagad ir iekļauts nosaukums, ir vienkāršs atlasīšanas vaicājums.

Apskatīsim, kā šī opcija darbojas neliela testa laikā ar 2000 izsaukumu sēriju ar vienlaicīgumu 20. Minimālais ilgums ir 18 ms ar vidējo 51 ms un maksimāli nedaudz vairāk par 1 sekundi (aukstā starta ilgums).

Lambda ilgums

Zemāk redzamajā grafikā parādīts, ka datu bāzei ir maksimālais astoņu savienojumu skaits.

Savienojumu skaits ar RDS datu bāzi 5 minūšu logā.

2. variants - izmantojiet globālo savienojumu

Otra iespēja ir definēt savienojumu kā globālu ārpus apstrādātāja metodes. Tad apstrādātājā mēs pievienojam pārbaudi, lai redzētu, vai savienojums pastāv, un pievienojam tikai tad, ja tā nav. Tas nozīmē, ka savienojums konteinerā tiek izveidots tikai vienreiz. Šādi iestatot savienojumu ar nosacījumu, nozīmē, ka mums nav nepieciešams izveidot savienojumu, ja to nepieprasa koda loģika.

Mēs vairs neslēdzam savienojumu ar datu bāzi, tāpēc savienojums paliek, lai turpinātu funkcijas izsaukšanu. Atkārtota savienojuma izmantošana ievērojami samazina siltās palaišanas ilgumu - vidējais ilgums ir aptuveni 3 reizes ātrāks un minimālais ir 1 ms, nevis 18 ms.

Lambda ilgumi

Savienojuma izveide ar RDS gadījumu ir laikietilpīgs uzdevums, un, lai izveidotu savienojumu ar katru izsaukumu, tas ir izdevīgi. Pieslēdzoties datu bāzei, lai veiktu vienkāršu datubāzes vaicājumu, mēs sasniedzam maksimālo datu bāzes savienojumu skaitu 20, kas atbilst vienlaicīguma līmenim (mēs veicām 20 vienlaicīgus izsaukumus x 100 reizes). Kad izsaukumu sērija apstājas, savienojumi pakāpeniski tiek slēgti.

Tagad, kad AWS ir palielinājis lambda ilguma pabalstu līdz 15 minūtēm, tas nozīmē, ka datu bāzes savienojumi varētu ilgt ilgāk un jūs varētu riskēt sasniegt RDS max savienojumu numuru. Noklusētos maksimālos savienojumus var pārrakstīt RDS parametru grupas iestatījumos, lai gan, palielinot maksimālo savienojumu skaitu, var rasties problēmas ar atmiņas piešķiršanu. Mazāku gadījumu maksimālā savienojuma noklusējuma vērtība var būt mazāka par 100. Ņemiet vērā šos ierobežojumus un pievienojiet lietojumprogrammas loģiku tikai tad, kad nepieciešams.

Globālā savienojuma izmantošana citiem uzdevumiem

Lambda savienojums ar S3

Kopējs uzdevums, kas mums varētu būt jāveic kopā ar Lambda, ir piekļūt S3 valsts datiem. Tālāk redzamais koda fragments ir AWS nodrošināts Python Lambda Function projekts - uz kuru jūs varat pāriet, piesakoties AWS konsolē un noklikšķinot šeit. Kodā var redzēt, ka S3 klients ir pilnībā definēts ārpus apstrādātāja, kad konteiners tiek inicializēts, turpretim RDS piemēram, globālais savienojums tika iestatīts apstrādātāja iekšpusē. Abas pieejas iestatīs globālos mainīgos, ļaujot tiem būt pieejamiem turpmākiem izsaukumiem.

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

Vides mainīgo atšifrēšana

Lambda konsole dod iespēju šifrēt savus vides mainīgos lielumus papildu drošībai. Šis koda fragments ir AWS nodrošināts Java piemērs palīga skriptam, lai atšifrētu vides mainīgos no funkcijas Lambda. Lai pārietu uz koda fragmentu, izpildiet šo apmācību (īpaši 6. darbību). Tā kā DECRYPTED_KEY ir definēts kā klases globāls, decryptKey () funkcija un loģika tiek saukta tikai vienu reizi vienā lambda konteinerā. Tāpēc mēs redzēsim ievērojamu uzlabošanos siltās palaišanas laikā.

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

Globālo mainīgo izmantošana citos FaaS risinājumos

AWS Lambda šī pieeja nav izolēta. Globālā savienojuma izmantošanas metodi var izmantot arī citām mākoņu pakalpojumu sniedzēju bez serveru funkcijām. Google mākoņa funkciju padomu un triku lapa sniedz labu skaidrojumu mainīgajiem, kas nav slinkie (kad mainīgais vienmēr tiek inicializēts ārpus apstrādātāja metodes), salīdzinot ar slinkiem mainīgajiem (globālais mainīgais tiek iestatīts tikai pēc nepieciešamības) globālajiem mainīgajiem.

Cita labākā prakse

Šeit ir daži citi labākie paņēmieni, kas jāpatur prātā.

Pārbaude

FaaS izmantošana atvieglo mikropakalpojumu arhitektūras izveidošanu. Un mazu, diskrētu funkcionalitātes elementu esamība iet roku rokā ar efektīvu vienības pārbaudi. Lai atvieglotu vienības testus:

  • Atcerieties izslēgt testa atkarības no lambda paketes.
  • Atsevišķa loģika prom no apstrādātāja metodes, kā jūs darītu ar programmas galveno metodi.

Atkarības un iepakojuma lielums

Izvietošanas paketes lieluma samazināšana nozīmē, ka koda lejupielāde būs ātrāka inicializēšanas laikā un tādējādi uzlabos aukstās palaišanas laiku. Noņemiet neizmantotās bibliotēkas un mirušo kodu, lai samazinātu izvietošanas ZIP faila lielumu. AWS SDK ir paredzēts Python un JavaScript izpildes periodiem, tāpēc nav nepieciešams tos iekļaut izvietošanas paketē.

Ja Node.js ir jūsu vēlamais Lambda izpildlaiks, jūs varētu izmantot minifikāciju un ugunifikāciju, lai samazinātu funkcijas koda lielumu un pēc iespējas samazinātu izvietošanas pakotnes lielumu. Dažus, bet ne visus minifikācijas un ugunifikācijas aspektus var izmantot arī citos izpildījumos, piem. no python koda nevar noņemt atstarpi, bet jūs varat noņemt komentārus un saīsināt mainīgo nosaukumus.

Atmiņas iestatīšana

Eksperiments, lai atrastu optimālo atmiņas daudzumu Lambda funkcijai. Jūs maksājat par atmiņas piešķiršanu, tāpēc atmiņas dubultošana nozīmē, ka jums jāmaksā divreiz par milisekundi; bet aprēķinātā ietilpība palielinās, piešķirot atmiņu, tāpēc tas varētu potenciāli samazināt darbības laiku līdz mazāk nekā pusei no tā, kas tas bija. Jau ir daži noderīgi rīki, lai izvēlētos jums optimālo atmiņas iestatījumu, piemēram, šis.

Secināt…

Jāapsver viena lieta, vai ir nepieciešama savienojuma atkārtotas izmantošanas metode. Ja jūsu lambda funkcija tiek izsaukta tikai reti, piemēram, vienu reizi dienā, tad jums nebūs izdevīgi optimizēt siltos sākumus. Bieži vien ir jāveic kompromiss starp veiktspējas optimizēšanu un koda koda lasāmību - termins “uglification” pats par sevi runā! Turklāt, pievienojot kodam globālos mainīgos, lai atkārtoti izmantotu savienojumus ar citiem pakalpojumiem, iespējams, jūsu kodu būs grūtāk izsekot. Prātā nāk divi jautājumi:

  • Vai jauns komandas loceklis sapratīs jūsu kodu?
  • Vai jūs un jūsu komanda nākotnē varēsit atkļūdot kodu?

Iespējams, ka esat izvēlējies Lambda pēc sava mēroga un vēlaties augstu veiktspēju un zemas izmaksas, tāpēc atrodiet līdzsvaru, kas atbilst jūsu komandas vajadzībām.

Šie ir autora viedokļi. Ja vien šajā amatā nav norādīts citādi, Capital One nav saistīts ar nevienu no minētajiem uzņēmumiem un to neapstiprina. Visas izmantotās vai attēlotās preču zīmes un cits intelektuālais īpašums ir to attiecīgo īpašnieku īpašumā. Šis raksts ir © 2019 Capital One.