Parimad tavad AWS Lambda konteineri taaskasutamiseks

Soe käivitumise optimeerimine AWS Lambda ühendamisel teiste teenustega

AWS Lambda pakub serveriteta ja kodakondsuseta oleku tõttu suurt skaleeritavust, võimaldades paljusid lambdafunktsiooni koopiaid kohe luua (nagu siin kirjeldatud). Rakenduse koodi kirjutamisel soovite tõenäoliselt siiski juurdepääsu mõnele seisukorra andmetele. See tähendab ühendamist andmepoodiga, näiteks RDS-eksemplariga või S3-ga. Kuid AWS Lambda teiste teenustega ühenduse loomine lisab teie funktsioonikoodile aega. Suurem skaleeritavus võib põhjustada ka kõrvalmõjusid, näiteks RDS-eksemplariga ühenduste maksimaalse arvu saavutamine. Üks võimalus selle vastu on konteineri korduvkasutamine AWS Lambdas ühenduse säilitamiseks ja lambda tööaja vähendamiseks.

Siin on mõned kasulikud skeemid, mis selgitavad lambda taotluse elutsüklit.

Järgmised toimuvad külmkäivituse ajal, kui teie funktsiooni käivitatakse esimest korda või pärast tegevusetust:

  • Kood ja sõltuvused laaditakse alla.
  • Uus konteiner on käivitatud.
  • Kestus käivitatakse.

Viimane samm on teie koodi käivitamine, mis juhtub iga kord, kui käivitatakse lambda-funktsioon. Kui konteinerit kasutatakse lambda-funktsiooni hilisemaks kutsumiseks uuesti, võime koodi käivitamisega edasi liikuda. Seda nimetatakse soojaks alguseks ja seda sammu saame optimeerida teiste teenustega ühenduse loomisel, määratledes ühenduse väljaspool käitleja meetodi rakendusala.

Ühendamine Lambda teiste AWS-teenustega

Näide: ühendage RDS-i eksemplariga, siit pärinevad AWS-i ikoonid

Meil on tavaline ja tavaline näide, mille kaudu läbi käia - soovime rikastamisandmete toomiseks luua ühenduse konteineri ressursiga. Selles näites on JSON-i koormus kaasas ID-ga ja Lambda-funktsioon loob ühenduse RDS-eksemplariga, mis töötab PostgreSQL-i, et leida ID-le vastav nimi, et saaksime rikastatud kasuliku koormuse tagastada. Kuna lambda-funktsioon on ühendatud RDS-iga, mis elab VPC-s, peab lambda-funktsioon nüüd elama ka privaatses alamvõrgus. See lisab külmkäivitusse paar sammu - VPC elastne võrguliides (ENI) tuleb kinnitada (nagu Jeremy Daly ajaveebis mainitud, see lisab teie külmkäivitustele aega).

Märkus. Kui me kasutaksime võtme / väärtuse salvestusruumi koos DynamoDB-ga RDS-i asemel, saaksime vältida VPC kasutamist.

Ma vaatan selle ülesande jaoks üle kaks lahendust, millest esimene on minu naiivne lahendus, teine ​​lahendus optimeerib soojad algusajad, kasutades uuesti ühendust hilisemate kutsumiste jaoks. Seejärel võrdleme iga lahenduse toimivust.

1. võimalus - ühendage käitleja RDS-iga

See koodinäide näitab, kuidas ma võin sellele ülesandele naiivselt läheneda - andmebaasiühendus on käitleja meetodi piires. Enne kasuliku kauba tagastamist ID-kaardi nime toomiseks on lihtne valikupäring, mis nüüd ka nime sisaldab.

Vaatame, kuidas see valik toimib väikese testi ajal, mille korral on 2000 kutset ja samaaegne väärtus 20. Minimaalne kestus on 18 ms, keskmiselt 51 ms ja maksimaalselt veidi üle ühe sekundi (külmkäivituse kestus).

Lambda kestus

Allolev graafik näitab, et andmebaasi on maksimaalselt kaheksa ühendust.

RDS-andmebaasiga ühenduste arv 5-minutises aknas.

2. võimalus - kasutage globaalset ühendust

Teine võimalus on määratleda ühendus globaalse käitlemismeetodi välisena. Seejärel lisame käitleja sees kontrolli, kas ühendus on olemas, ja ühendame ühenduse ainult siis, kui seda pole. See tähendab, et ühenduse luuakse konteineri kohta ainult üks kord. Sel viisil ühenduse loomine tingimuslikult paigas tähendab, et me ei pea ühendust looma, kui seda ei vaja koodiloogika.

Me ei sulge enam ühenduse andmebaasiga, nii et ühendus jääb funktsiooni hilisemaks kutsumiseks. Ühenduse taaskasutamine vähendab soojakäivituse kestust märkimisväärselt - keskmine kestus on umbes 3 korda kiirem ja minimaalne on 1 ms, mitte 18 ms.

Lambda kestused

RDS-eksemplariga ühenduse loomine on aeganõudev ülesanne ja iga kutsumise korral ühenduseta jätmine on jõudlusele kasulik. Kui ühendate andmebaasiga lihtsa andmebaasipäringu, saavutame maksimaalse andmebaasiühenduste arvu 20, mis vastab samaaegsuse tasemele (tegime 20 samaaegset kutset x 100 korda). Kui kutsumiste maht peatub, siis ühendused suletakse järk-järgult.

Nüüd, kui AWS on suurendanud lambda kestuse lisandväärtust 15 minutini, tähendab see, et andmebaasiühendused võivad kesta kauem ja võite olla oht, et jõuate RDS max ühenduste numbrini. Max vaikimisi ühendusi saab RDS-i parameetrigrupi sätetes üle kirjutada, kuigi ühenduste maksimaalse arvu suurendamine võib põhjustada probleeme mälu jaotamisega. Väiksemate eksemplaride max_ühenduste vaikeväärtus võib olla väiksem kui 100. Pidage neid piiranguid meeles ja lisage rakenduse loogikat ainult siis, kui vaja, andmebaasiga ühenduse loomiseks.

Globaalse ühenduse kasutamine muude ülesannete jaoks

Lambda ühendamine S3-ga

Ühine ülesanne, mida peame Lambdaga täitma, on S3-st olevatele riiklikele andmetele juurdepääs. Allpool olev koodilõik on AWS-i pakutav Python Lambda Functioni projekt - mille juurde saate liikuda, logides sisse AWS-i konsooli ja klõpsates siin. Koodist näete, et S3 klient on konteineri initsialiseerimisel väljaspool käitlejat täielikult määratletud, samas kui RDS-i näites määrati globaalne ühendus käitleja sees. Mõlemad lähenemisviisid määravad globaalsed muutujad, võimaldades neil olla kättesaadavad edaspidiseks kutsumiseks.

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

Keskkonnamuutujate dekrüptimine

Lambdakonsool annab teile täiendava turvalisuse tagamiseks võimaluse oma keskkonnamuutujad krüptida. Järgmine koodilõik on AWS-i pakutav Java näide abistaja skripti kohta keskkonnamuutujate dekrüptimiseks Lambda funktsioonist. Koodilõigu juurde navigeerimiseks järgige seda õpetust (täpsemalt 6. samm). Kuna DECRYPTED_KEY on määratletud klassi globaalsena, kutsutakse funktsiooni decryptKey () ja loogikat lambda konteineri kohta ainult üks kord. Seetõttu näeme sooja käivituse kestust märkimisväärselt.

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

Globaalsete muutujate kasutamine teistes FaaS-lahendustes

See lähenemisviis pole AWS Lambda puhul eraldatud. Globaalse ühenduse kasutamise meetodit saab rakendada ka muude pilveteenuse pakkujate serverita funktsioonide jaoks. Google'i pilvefunktsioonide näpunäidete leht annab hea selgituse mitte-laisate muutujate (kui muutuja initsieeritakse alati väljaspool käitleja meetodit) ja laisate muutujate (globaalne muutuja seatakse ainult vajadusel) globaalsete muutujate kohta.

Muud parimad tavad

Siin on mõned muud parimad tavad, mida tuleks meeles pidada.

Testimine

FaaSi kasutamine hõlbustab mikroteenuste arhitektuuri olemasolu. Ja väikeste, diskreetsete funktsionaalsuste olemasolu on käsikäes tõhusa ühiku testimisega. Ühiktestide hõlbustamiseks toimige järgmiselt.

  • Ärge unustage testisõltuvusi lambda-paketist välja jätta.
  • Eraldage loogika käitleja meetodist, nagu teeksite programmi peamise meetodi korral.

Sõltuvused ja pakendi suurus

Juurutuspaketi suuruse vähendamine tähendab, et koodi allalaadimine toimub lähtestamisel kiiremini ja parandab seetõttu teie külmkäivitusaegu. Kasutuselevõtu ZIP-faili suuruse vähendamiseks eemaldage kasutamata teegid ja surnud kood. AWS SDK on ette nähtud Pythoni ja JavaScripti käitusperioodide jaoks, seega pole vaja neid oma juurutuspaketti lisada.

Kui teie Lambda eelistatud käitusaeg on Node.js, saate funktsioonikoodi suuruse vähendamiseks ja juurutuspaketi suuruse vähendamiseks rakendada minimeerimist ja uglifikatsiooni. Mõningaid, kuid mitte kõiki tahke ja uglifikatsiooni aspekte saab rakendada ka muude jooksuaegade jaoks, nt. python-koodist tühimikku ei saa eemaldada, kuid saate eemaldada kommentaarid ja lühendada muutujate nimesid.

Mälu seadistamine

Katse Lambda funktsiooni jaoks optimaalse mälumahu leidmiseks. Maksate mälu eraldamise eest, nii et mälu kahekordistamine tähendab, et peate maksma topelt millisekundi kohta; kuid arvutusmaht suureneb koos eraldatud mäluga, nii et see võib potentsiaalselt vähendada tööaega vähem kui pooleni sellest, mis ta oli. Teie jaoks optimaalse mälusätte valimiseks on juba olemas mõned kasulikud tööriistad, näiteks käesolev.

Kokkuvõtteks…

Üks asi, mida tuleks kaaluda, on ühenduse korduskasutusmeetodi rakendamine vajalik. Kui teie lambdafunktsiooni kasutatakse ainult harva, näiteks üks kord päevas, siis pole soojakäivituse optimeerimine teile kasulik. Toimivuse optimeerimise ja teie koodi loetavuse vahel tuleb sageli teha kompromiss - mõiste “uglification” räägib iseenesest! Lisaks võib koodile globaalsete muutujate lisamine teiste teenustega ühenduste taaskasutamiseks muuta teie koodi raskesti jälgitavaks. Kaks küsimust tulevad meelde:

  • Kas uus meeskonnaliige saab teie koodist aru?
  • Kas saate teie ja teie meeskond tulevikus koodi siluda?

Kuid on tõenäoline, et olete valinud Lambda oma ulatuse järgi ja soovite kõrgeid tulemusi ja madalaid kulusid, seega leidke tasakaal, mis sobib teie meeskonna vajadustega.

Need arvamused on autori arvamused. Kui selles postituses ei ole märgitud teisiti, pole Capital One seotud ega kuulu ühegi nimetatud äriühinguga. Kõik kasutatavad või kuvatavad kaubamärgid ja muu intellektuaalomand on nende vastavate omanike omanduses. See artikkel on © 2019 Capital One.