Programavimas

Skaičiavimas be serverio naudojant „AWS Lambda“, 1 dalis

Skaičiavimas be serverių šiandien gali būti karščiausias debesų kompiuterijos dalykas, bet kas tai yra? Ši dviejų dalių mokymo programa pradedama skaičiuojant be serverio - nuo to, kas tai yra, iki to, kodėl tai laikoma trikdančia tradicinį debesų kompiuteriją, ir kaip galite ją naudoti programuodami „Java“.

Po apžvalgos gausite praktinę „AWS Lambda“ įvadą, kurį daugelis laiko premjeriniu „Java“ pagrindu atliekamu kompiuterinių kompiuterių skaičiavimo sprendimu. 1 dalyje naudosite „AWS Lambda“, kad sukurtumėte, įdiegtumėte ir išbandytumėte savo pirmąją „Lambda“ funkciją „Java“. 2 dalyje integruosite savo „Lambda“ funkciją su „DynamoDB“, tada naudokite AWS SDK, kad iškviestumėte „Lambda“ funkcijas „Java“ programoje.

Kas yra kompiuterizavimas be serverio?

Praėjusiais metais kalbėjausi su įmonės praktikantu apie skirtingus architektūros modelius ir minėjau architektūrą be serverių. Jis greitai pastebėjo, kad visoms programoms reikalingas serveris ir jos negali veikti ore. Stažuotojas turėjo tašką, net jei jam trūko mano. Skaičiavimas be serverių nėra stebuklinga programų paleidimo platforma.

Iš tiesų, be serverio skaičiavimas paprasčiausiai reiškia, kad jūs, kūrėjas, neprivalote susitvarkyti serverio. Be serverio skaičiavimo platforma, tokia kaip „AWS Lambda“, galite sukurti savo kodą ir jį įdiegti niekada nereikalaudami konfigūruoti ar tvarkyti pagrindinių serverių. Jūsų dislokavimo vienetas yra jūsų kodas; ne konteinerį, kuriame yra kodas, ar serverį, kuris valdo kodą, o tiesiog patį kodą. Produktyvumo požiūriu yra akivaizdžių pranašumų perkraunant išsamią informaciją apie tai, kur saugomas kodas ir kaip valdoma vykdymo aplinka. Be serverio skaičiavimas taip pat kainuoja pagal vykdymo metriką, todėl yra ir finansinis pranašumas.

Ką kainuoja „AWS Lambda“?

Šio rašymo metu „AWS Lambda“ kainos pakopa priklauso nuo įvykdymų skaičiaus ir vykdymo trukmės:

  • Jūsų pirmasis milijonas egzekucijų per mėnesį yra nemokama, tada mokate 0,20 USD už milijoną egzekucijų (0,0000002 USD už užklausą).
  • Trukmė skaičiuojama nuo to laiko, kai jūsų kodas pradeda vykdyti, kol jis pateikia rezultatą, suapvalintą iki artimiausio 100 ms. Apmokestinta suma pagrįsta funkcijai paskirto RAM kiekiu, kurio kaina yra 0,00001667 USD už kiekvieną GB sekundę.

Kainodaros informacija ir nemokamų pakopų paskirstymas yra šiek tiek sudėtingesni, nei matyti iš apžvalgos. Apsilankykite kainų pakopoje, kad peržiūrėtumėte kelis kainodaros scenarijus.

Norėdami sužinoti, kaip veikia kompiuteris be serverio, pradėkime nuo kompiuterio be serverio vykdymo modelio, kuris pavaizduotas 1 paveiksle.

Stevenas Hainesas

Trumpai tariant, vykdymo be serverio modelis:

  1. Klientas pateikia užklausą be serverio skaičiavimo platformai vykdyti tam tikrą funkciją.
  2. Be serverio skaičiavimo platforma pirmiausia patikrina, ar funkcija veikia bet kuriame iš jos serverių. Jei funkcija dar neveikia, platforma įkelia funkciją iš duomenų saugyklos.
  3. Tada platforma dislokuoja funkciją viename iš savo serverių, kurie iš anksto sukonfigūruoti su vykdymo aplinka, galinčia paleisti funkciją.
  4. Jis vykdo funkciją ir užfiksuoja rezultatą.
  5. Jis grąžina rezultatą klientui.

Kartais skaičiavimas be serverio vadinamas funkcija kaip paslauga (FaaS), nes jūsų sukurto kodo detalumas yra funkcija. Platforma vykdo jūsų funkciją savo serveryje ir organizuoja procesą tarp funkcijų užklausų ir funkcijų atsakymų.

Nano paslaugos, mastelis ir kaina

Kompiuteriuose be serverių iš tikrųjų svarbu trys dalykai: jo nanoserviso architektūra; tai, kad jis praktiškai yra be galo keičiamas; ir kainų modelį, susijusį su tuo beveik begaliniu masteliu. Mes įsigilinsime į kiekvieną iš šių veiksnių.

Nano paslaugos

Jūs girdėjote apie mikropaslaugas ir tikriausiai žinote apie 12 veiksnių programas, tačiau be serverio funkcijos pakelia komponento suskaidymą iki sudedamųjų dalių į visiškai naują lygmenį. Terminas „nanoservisai“ nėra pramonėje pripažintas terminas, tačiau idėja yra paprasta: kiekviena nanoservisa turėtų įgyvendinti vieną veiksmą ar atsakomybę. Pavyzdžiui, jei norėtumėte sukurti valdiklį, kūrimo veiksmas būtų jo paties nanoservisas; jei norėtumėte gauti valdiklį, paieškos veiksmas taip pat būtų nanoservisas; ir jei norėtumėte pateikti valdiklio užsakymą, tai būtų dar viena nanoservisa.

Nano paslaugų architektūra leidžia apibrėžti savo taikymą labai smulkmeniškai. Panašiai kaip bandomoji plėtra (kuri padeda išvengti nepageidaujamo šalutinio poveikio, užrašant kodą atskirų testų lygiu), nanoservisų architektūra skatina apibrėžti jūsų programą labai smulkių ir specifinių funkcijų požiūriu. Šis metodas padidina aiškumą, ką kuriate, ir sumažina nepageidaujamus naujojo kodo šalutinius poveikius.

Mikroservistai ir nanoservisai

„Microservices“ skatina mus suskaidyti programą į paslaugų rinkinį, kuris kiekvienas atlieka tam tikrą užduotį. Iššūkis yra tas, kad niekas iš tikrųjų neįvertino taikymo sritį mikropaslaugos. Todėl galų gale apibrėžiame, kad mikro paslaugos yra susijusių paslaugų rinkinys, visi sąveikauja su tuo pačiu duomenų modeliu. Konceptualiai, jei turite žemo lygio funkcionalumą, sąveikaujantį su tam tikru duomenų modeliu, funkcionalumas turėtų būti įtrauktas į vieną iš susijusių paslaugų. Aukšto lygio sąveika turėtų skambinti į tarnybą, o ne tiesiogiai pateikti duomenų bazės užklausas.

Be serverio vyksta nuolatinės diskusijos apie tai, ar kurti „Lambda“ funkcijas mikroservių, ar nanosakmenų lygiu. Geros naujienos yra tai, kad galite gana lengvai sukurti savo funkcijas bet kuriuo detalumu, tačiau mikropaslaugų strategijai jūsų užklausų tvarkytuve reikės šiek tiek papildomos nukreipimo logikos.

Projektavimo požiūriu programos be serverių turėtų būti labai tiksliai apibrėžtos ir švarios. Iš diegimo perspektyvos turėsite valdyti žymiai daugiau diegimų, tačiau taip pat galėsite individualiai diegti naujas savo funkcijų versijas, nepaveikdami kitų funkcijų. Skaičiavimas be serverio yra ypač tinkamas kūrimui didelėse komandose, kur tai gali padėti palengvinti kūrimo procesą ir mažiau klaidų.

Mastelis

Be naujos architektūrinės paradigmos, be serverio skaičiavimo platformos suteikia praktiškai begalinį mastelį. Aš sakau „praktiškai“, nes nėra tokio dalyko kaip nuoširdžiai begalinis mastelis. Visais praktiniais tikslais kompiuterių be serverių teikėjai, tokie kaip „Amazon“, gali atlaikyti didesnę apkrovą, nei galėtumėte į juos numesti. Jei valdytumėte savo serverių (arba debesų pagrindu veikiančių virtualių mašinų) mastelio didinimą, kad patenkintumėte padidėjusią paklausą, turėtumėte stebėti naudojimą, nustatyti, kada pradėti daugiau serverių, ir tinkamu laiku pridėti daugiau serverių prie savo grupės. Panašiai, sumažėjus paklausai, jums reikės rankiniu būdu sumažinti mastelį. Naudodami kompiuterį be serverio, savo serverio neturinčiai kompiuterių platformai nurodote maksimalų skaičių tuo pačiu metu atliekamų funkcijų užklausų, kurias norite paleisti, o platforma atlieka mastelį už jus.

Kainodara

Galiausiai, be serverio skaičiavimo kainodaros modelis leidžia apskaičiuoti debesies sąskaitą pagal naudojimą. Kai naudosite mažai šviesos, jūsų sąskaita bus maža (arba nulinė, jei liksite laisvame diapazone). Žinoma, jūsų sąskaita padidės naudojant, tačiau tikimės, kad taip pat turėsite naujų pajamų didesnei debesies sąskaitai paremti. Priešingai, jei tvarkytumėte savo serverius, turėtumėte sumokėti bazinę kainą, kad paleistumėte mažiausią reikalaujamą serverių skaičių. Padidėjus naudojimui, padidinsite visą serverį, o ne atskirų funkcijų iškvietas. Skaičiavimo be serverio kainodaros modelis yra tiesiogiai proporcingas jūsų naudojimui.

„AWS Lambda“, skirta skaičiavimui be serverio

„AWS Lambda“ yra kompiuterių be serverių platforma, įdiegta „Amazon Web Services“ platformose, tokiose kaip EC2 ir S3. „AWS Lambda“ šifruoja ir saugo jūsų kodą S3. Kai prašoma paleisti funkciją, ji sukuria „konteinerį“ naudodama jūsų vykdymo laiko specifikacijas, įdiegia jį viename iš EC2 egzempliorių savo skaičiavimo ūkyje ir vykdo tą funkciją. Procesas parodytas 2 paveiksle.

Stevenas Hainesas

Kurdami „Lambda“ funkciją, ją sukonfigūravote „AWS Lambda“, nurodydami tokius dalykus kaip vykdymo trukmės aplinka (šiam straipsniui naudosime „Java 8“), kiek atminties jai skirti, tapatybės ir prieigos valdymo vaidmenys bei metodas vykdyti. „AWS Lambda“ naudoja jūsų konfigūraciją, kad sukonfigūruotų sudėtinį rodinį ir įdėtų konteinerį į EC2 egzempliorių. Tada jis vykdo nurodytą metodą paketo, klasės ir metodo tvarka.

Šiuo metu galite sukurti „Lambda“ funkcijas „Node“, „Java“, „Python“ ir pastaruoju metu „C #“. Šiame straipsnyje naudosime „Java“.

Kas yra „Lambda“ funkcija?

Kai rašote kodą, skirtą veikti „AWS Lambda“, rašote funkcijos. Terminas funkcijos gaunamas iš funkcinio programavimo, kuris kilo iš lambda skaičiavimo. Pagrindinė idėja yra sukurti programą kaip funkcijų rinkinį, kuris yra metodai, kurie priima argumentus, apskaičiuoja rezultatą ir neturi nepageidaujamų šalutinių poveikių. Funkcinis programavimas reiškia matematinį požiūrį į kodo rašymą, kuris gali būti įrodytas kaip teisingas. Nors rašant „AWS Lambda“ kodą gerai nepamiršti funkcinio programavimo, viskas, ką iš tikrųjų reikia suprasti, yra tai, kad ši funkcija yra vieno metodo įvesties taškas, kuris priima įvesties objektą ir grąžina išvesties objektą.

Be serverio vykdymo režimai

Nors „Lambda“ funkcijos gali veikti sinchroniškai, kaip aprašyta aukščiau, jos taip pat gali veikti asinchroniškai ir reaguojant į įvykius. Pvz., Galite sukonfigūruoti „Lambda“, kad ji veiktų, kai failas būtų įkeltas į S3 grupę. Ši konfigūracija kartais naudojama vaizdams ar vaizdo įrašams apdoroti: kai į S3 kibirą įkeliamas naujas vaizdas, jį apdorojant iškviečiama „Lambda“ funkcija su nuoroda į vaizdą.

Dirbau su labai didele įmone, kuri pasinaudojo šiuo sprendimu fotografams, įveikiantiems maratoną. Fotografai dalyvavo kurse ir fotografavo. Kai jų atminties kortelės buvo pilnos, jie įkėlė vaizdus į nešiojamąjį kompiuterį ir įkėlė failus į S3. Įkeliant vaizdus, ​​buvo vykdomos „Lambda“ funkcijos, kad būtų galima pakeisti dydį, pažymėti vandenženkliu ir pridėti kiekvieno atvaizdo nuorodą į jo bėgiklį duomenų bazėje.

Visa tai pareikalautų daug darbo rankiniu būdu, tačiau šiuo atveju darbas ne tik buvo greičiau apdorotas dėl „AWS Lambda“ horizontalaus mastelio keitimo, bet ir sklandžiai didinamas ir mažinamas, taip optimizuojant įmonės sąskaitą debesyje.

Be atsakymo į į S3 įkeltus failus, „lambdas“ gali suaktyvinti kiti šaltiniai, pavyzdžiui, įrašai, įterpiami į „DynamoDB“ duomenų bazę, ir analitinė informacija, transliuojama iš „Amazon Kinesis“. 2 dalyje apžvelgsime „DynamoDB“ pavyzdį.

„AWS Lambda“ veikia „Java“

Dabar, kai šiek tiek žinote apie kompiuterį be serverio ir „AWS Lambda“, aš jums padėsime sukurti „AWS Lambda“ funkciją „Java“.

atsisiųsti Gaukite šios mokymo programos pavyzdinės programos „Kompiuterio be serverio su AWS Lambda“ kodą. Stevenas Hainesas sukūrė „JavaWorld“.

Lambda funkcijų įgyvendinimas

„Lambda“ funkciją galite parašyti vienu iš dviejų būdų:

  • Funkcija gali priimti įvesties srautą klientui ir rašyti į išvesties srautą atgal klientui.
  • Funkcija gali naudoti iš anksto nustatytą sąsają, tokiu atveju „AWS Lambda“ automatiškai deserializuos įvesties srautą objektui, perduos jį jūsų funkcijai ir nuosekliai surašys jūsų funkcijos atsakymą prieš grąžindama jį klientui.

Lengviausias būdas įgyvendinti „AWS Lambda“ funkciją yra naudoti iš anksto nustatytą sąsają. Jei naudojate „Java“, pirmiausia į savo projektą turite įtraukti šią pagrindinę „AWS Lambda“ biblioteką (atkreipkite dėmesį, kad šiame pavyzdyje naudojamas „Maven“):

 com.amazonaws aws-lambda-java-core 1.1.0 

Tada leiskite savo klasei įdiegti šią sąsają:

Sąrašas 1. RequestHandler.java

 viešoji sąsaja „RequestHandler“ {/ ** * Tvarko „Lambda“ funkcijos užklausą * @param input „Lambda“ funkcijos įvestis * @param context „Lambda“ vykdymo aplinkos konteksto objektas. * @return „Lambda“ funkcijos išvestis * / public O handleRequest (I įvestis, konteksto kontekstas); } 

RequestHandler sąsaja apibrėžia vieną metodą: handRequest (), kuriam perduodamas įvesties objektas ir a Kontekstas objektą ir grąžina išvesties objektą. Pavyzdžiui, jei apibrėžtumėte a Prašymas klasė ir a Atsakymas klasėje, jūs galėtumėte įgyvendinti savo lambda taip:

 viešoji klasė „MyHandler“ įgyvendina „RequestHandler“ {public Response handleRequest (užklausos užklausa, konteksto kontekstas) {...}} 

Arba, jei norite apeiti iš anksto nustatytą sąsają, galite rankiniu būdu tvarkyti „InputStream“ ir „OutputStream“ patys, įgyvendindami metodą su tokiu parašu:

 public void handleRequest („InputStream“ inputStream, OutputStream outputStream, Context context) išmeta „IOException“ {...} 

Kontekstas objektas pateikia informaciją apie jūsų funkciją ir aplinką, kurioje ji veikia, pvz., funkcijos pavadinimą, jos atminties limitą, žurnalą ir likusį laiką milisekundėmis, kurį funkcija turi atlikti prieš AWS Lambda ją nužudant.

$config[zx-auto] not found$config[zx-overlay] not found