Programmēšana

Bezserveru skaitļošana ar AWS Lambda, 1. daļa

Bezserveru skaitļošana šodien var būt karstākā mākoņskaitļošanā, bet kas tieši tas ir? Šī divu daļu apmācība sākas ar pārskatu par skaitļošanu bez serveriem - sākot no tā, kas tas ir, līdz kādēļ tas tiek uzskatīts par traucējošu tradicionālajai mākoņskaitļošanai un kā jūs to varat izmantot Java programmēšanā.

Pēc pārskata jūs saņemsiet praktisku ievadu AWS Lambda, kuru daudzi šodien uzskata par pirmizrādes Java balstītu risinājumu skaitļošanai bez servera. 1. daļā jūs izmantosiet AWS Lambda, lai izveidotu, izvietotu un pārbaudītu savu pirmo Lambda funkciju Java. 2. daļā jūs integrēsiet savu Lambda funkciju ar DynamoDB, pēc tam izmantojiet AWS SDK, lai izsauktu Lambda funkcijas Java lietojumprogrammā.

Kas ir skaitļošana bez servera?

Pagājušajā gadā es runāju ar uzņēmuma praktikantu par dažādiem arhitektūras modeļiem un pieminēju bez servera arhitektūru. Viņš ātri atzīmēja, ka visām lietojumprogrammām ir nepieciešams serveris un tās nevar darboties pa zemi. Praktikantam bija punkts, pat ja viņam pietrūka manējā. Bezserveru skaitļošana nav maģiska platforma lietojumprogrammu darbināšanai.

Patiesībā, bez servera skaitļošana vienkārši nozīmē, ka jums, izstrādātājam, tas nav jādara samierinies serveris. Bezserveru skaitļošanas platforma, piemēram, AWS Lambda, ļauj jums izveidot savu kodu un izvietot to bez nepieciešamības konfigurēt vai pārvaldīt pamatā esošos serverus. Jūsu izvietošanas vienība ir jūsu kods; nevis konteiners, kas mitina kodu, vai serveris, kas vada kodu, bet vienkārši pats kods. No produktivitātes viedokļa ir acīmredzamas priekšrocības, ja tiek izkrauta informācija par to, kur kods tiek glabāts un kā tiek pārvaldīta izpildes vide. Arī bez servera skaitļošanas cena tiek noteikta, pamatojoties uz izpildes rādītājiem, tāpēc ir arī finansiālas priekšrocības.

Ko maksā AWS Lambda?

Šīs rakstīšanas laikā AWS Lambda cenu līmenis ir balstīts uz izpildījumu skaitu un izpildes ilgumu:

  • Jūsu pirmais miljons nāvessodu mēnesī ir bez maksas, pēc tam jūs maksājat 0,20 USD par miljonu izpildījumu (0,0000002 USD par pieprasījumu).
  • Ilgums tiek aprēķināts no brīža, kad jūsu kods sāk izpildīt, līdz tas atgriež rezultātu, noapaļojot līdz tuvākajiem 100 ms. Iekasētā summa ir balstīta uz funkcijai piešķirtās RAM daudzumu, kur izmaksas ir 0,00001667 USD par katru GB sekundi.

Cenu informācija un bezmaksas līmeņa piešķiršana ir nedaudz sarežģītāka, nekā paredzēts pārskatā. Apmeklējiet cenu līmeni, lai iepazītos ar dažiem cenu noteikšanas scenārijiem.

Lai iegūtu priekšstatu par to, kā darbojas skaitļošana bez servera, sāksim ar bez servera skaitļošanas izpildes modeli, kas parādīts 1. attēlā.

Stīvens Heinss

Lūk, bez servera izpildes modelis īsumā:

  1. Klients nosūta bez servera skaitļošanas platformai pieprasījumu izpildīt noteiktu funkciju.
  2. Bezserveru skaitļošanas platforma vispirms pārbauda, ​​vai funkcija darbojas kādā no tās serveriem. Ja funkcija vēl nedarbojas, platforma ielādē funkciju no datu krātuves.
  3. Pēc tam platforma izvieto funkciju vienā no saviem serveriem, kas ir iepriekš konfigurēti ar izpildes vidi, kas var palaist funkciju.
  4. Tas izpilda funkciju un uztver rezultātu.
  5. Tas atgriež rezultātu klientam.

Dažreiz bez servera skaitļošanu sauc par funkciju kā pakalpojumu (FaaS), jo izveidotā koda precizitāte ir funkciju. Platforma izpilda jūsu funkciju savā serverī un organizē procesu starp funkciju pieprasījumiem un funkciju atbildēm.

Nanoservisi, mērogojamība un cena

Trīs lietas, kas saistītas ar skaitļošanu bez servera: tās nanoservisa arhitektūra; fakts, ka tas ir praktiski bezgalīgi pielāgojams; un cenu modelis, kas saistīts ar šo gandrīz bezgalīgo mērogojamību. Mēs izpētīsim katru no šiem faktoriem.

Nanoservisi

Jūs esat dzirdējuši par mikropakalpojumiem un, iespējams, zināt par 12 faktoru lietojumprogrammām, taču bez servera funkcijas komponentes sadalīšanas paradigmu līdz tās sastāvdaļām pārvērš pilnīgi jaunā līmenī. Termins "nanoserviss" nav nozarē atzīts termins, bet ideja ir vienkārša: katram nanoservisam ir jāīsteno viena darbība vai atbildība. Piemēram, ja vēlaties izveidot logrīku, radīšanas akts būtu tā paša nanopakalpojums; ja vēlaties izgūt logrīku, izguves darbība būtu arī nanopakalpojums; un, ja jūs vēlaties veikt pasūtījumu logrīkam, tas būtu vēl viens nanoserviss.

Nanoservisu arhitektūra ļauj definēt lietojumprogrammu ļoti precīzā līmenī. Līdzīgi kā uz testiem balstīta izstrāde (kas palīdz izvairīties no nevēlamām blakusparādībām, uzrakstot kodu atsevišķu testu līmenī), arī nanoservisu arhitektūra mudina definēt savu lietojumu ļoti sīku un specifisku funkciju izteiksmē. Šī pieeja palielina skaidrību par to, ko jūs veidojat, un samazina jaunā koda nevēlamās blakusparādības.

Mikropakalpojumi vs nanopakalpojumi

Mikroserviss mudina mūs sadalīt lietojumprogrammu pakalpojumu kopumā, kas katrs veic noteiktu uzdevumu. Izaicinājums ir tāds, ka neviens nav īsti kvantificējis darbības joma mikropakalpojumu. Rezultātā mēs galu galā definējam mikropakalpojumus kā saistītu pakalpojumu kopumu, kas visi mijiedarbojas ar to pašu datu modeli. Konceptuāli, ja jums ir zema līmeņa funkcionalitāte, kas mijiedarbojas ar konkrēto datu modeli, tad funkcionalitātei jāietilpst vienā no saistītajiem pakalpojumiem. Augsta līmeņa mijiedarbībai būtu jāzvana uz pakalpojumu, nevis tieši vaicāt datu bāzē.

Bezserveru skaitļošanā turpinās debates par to, vai Lambda funkcijas veidot mikropakalpojumu vai nanoservisu līmenī. Labā ziņa ir tā, ka jūs varat diezgan viegli izveidot savas funkcijas, neatkarīgi no tā, vai tā ir detalizēta, taču mikropakalpojumu stratēģijai jūsu pieprasījumu apstrādātājā būs nepieciešama nedaudz papildu maršrutēšanas loģika.

No dizaina viedokļa bez servera lietojumprogrammām jābūt ļoti precīzi definētām un tīrām. No izvietošanas viedokļa jums būs jāpārvalda ievērojami vairāk izvietojumu, taču jums būs arī iespēja individuāli izvietot jaunas savu funkciju versijas, neietekmējot citas funkcijas. Bezserveru skaitļošana ir īpaši piemērota izstrādei lielās komandās, kur tā var palīdzēt vienkāršot izstrādes procesu un mazāk kodēt kļūdas.

Mērogojamība

Papildus jaunas arhitektūras paradigmas ieviešanai bez servera skaitļošanas platformas nodrošina praktiski bezgalīgu mērogojamību. Es saku "praktiski", jo nav tādas lietas kā patiesi bezgalīga mērogojamība. Visiem praktiskiem mērķiem, piemēram, bez servera skaitļošanas pakalpojumu sniedzēji, piemēram, Amazon, var tikt galā ar lielāku slodzi, nekā jūs varētu viņiem mest. Ja jums vajadzētu pārvaldīt savu serveru (vai mākoņa bāzes virtuālo mašīnu) palielināšanu, lai apmierinātu pieaugošo pieprasījumu, jums būs jāuzrauga lietojums, jāidentificē, kad jāsāk vairāk serveru, un savam klasterim vajadzīgajā laikā jāpievieno vairāk serveru. Tāpat, samazinoties pieprasījumam, jums vajadzētu manuāli samazināt. Izmantojot bez servera skaitļošanu, jūs paziņojat savai bez servera skaitļošanas platformai maksimālo vienlaicīgo funkciju pieprasījumu skaitu, kuru vēlaties izpildīt, un platforma veic mērogošanu jūsu vietā.

Cenu noteikšana

Visbeidzot, bezserveru skaitļošanas cenu modelis ļauj jums samazināt mākoņa rēķinu, pamatojoties uz lietojumu. Kad jūs izmantojat nedaudz, jūsu rēķins būs mazs (vai nulle, ja paliksit brīvā diapazonā). Protams, jūsu rēķins palielināsies līdz ar lietošanu, taču, cerams, jums būs arī jauni ieņēmumi, lai atbalstītu jūsu augstāko mākoņa rēķinu. Turpretī, ja pārvaldītu savus serverus, jums būtu jāmaksā bāzes izmaksas, lai palaistu minimālo nepieciešamo serveru skaitu. Palielinoties lietojumam, jūs palielināsiet visu serveru, nevis atsevišķu funkciju izsaukumu soli. Bezserveru skaitļošanas cenu modelis ir tieši proporcionāls jūsu lietojumam.

AWS Lambda skaitļošanai bez servera

AWS Lambda ir bez servera skaitļošanas platforma, kas ieviesta virs Amazon Web Services platformām, piemēram, EC2 un S3. AWS Lambda šifrē un saglabā jūsu kodu S3. Kad tiek prasīts, lai funkcija palaistu, tā izveido "konteineru", izmantojot jūsu izpildlaika specifikācijas, izvieto to vienā no EC2 gadījumiem savā skaitļošanas fermā un izpilda šo funkciju. Process ir parādīts 2. attēlā.

Stīvens Heinss

Veidojot Lambda funkciju, to jākonfigurē AWS Lambda, norādot tādas lietas kā izpildlaika vide (šim rakstam izmantosim Java 8), cik daudz atmiņas tai jāpiešķir, identitātes un piekļuves pārvaldības lomas un metode izpildīt. AWS Lambda izmanto jūsu konfigurāciju, lai iestatītu konteineru un izvietotu konteineru EC2 instancē. Pēc tam tā izpilda norādīto metodi paketes, klases un metodes secībā.

Šīs rakstīšanas laikā jūs varat izveidot Lambda funkcijas mezglos, Java, Python un pavisam nesen C #. Šī raksta vajadzībām mēs izmantosim Java.

Kas ir Lambda funkcija?

Rakstot kodu, kas paredzēts darbībai AWS Lambda, jūs rakstāt funkcijas. Termiņš funkcijas nāk no funkcionālās programmēšanas, kas radusies lambda aprēķināšanā. Pamatideja ir sastādīt lietojumprogrammu kā funkciju kopumu, kas ir metodes, kas pieņem argumentus, aprēķina rezultātu un tām nav nevēlamu blakusparādību. Funkcionālā programmēšana izmanto matemātisku pieeju koda rakstīšanai, kuru var pierādīt kā pareizu. Lai gan, rakstot AWS Lambda kodu, ir labi paturēt prātā funkcionālo programmēšanu, viss, kas jums patiešām ir jāsaprot, ir tas, ka funkcija ir vienas metodes ieejas punkts, kas pieņem ievades objektu un atgriež izvades objektu.

Bez servera izpildes režīmi

Lai gan Lambda funkcijas var darboties sinhroni, kā aprakstīts iepriekš, tās var darboties arī asinhroni un reaģējot uz notikumiem. Piemēram, jūs varat konfigurēt Lambda darbībai ikreiz, kad fails tiek augšupielādēts S3 spainī. Šo konfigurāciju dažreiz izmanto attēlu vai video apstrādei: kad jauns attēls tiek augšupielādēts S3 spainī, tā apstrādei tiek izmantota Lambda funkcija ar atsauci uz attēlu.

Es strādāju ar ļoti lielu uzņēmumu, kas izmantoja šo risinājumu fotogrāfiem, kuri veica maratonu. Fotogrāfi piedalījās kursā un fotografēja. Kad atmiņas kartes bija pilnas, viņi ielādēja attēlus klēpjdatorā un augšupielādēja failus S3. Augšupielādējot attēlus, tika izpildītas Lambda funkcijas, lai mainītu izmērus, ūdenszīmi un pievienotu atsauci katram attēlam tā bāzē datu bāzē.

Tas viss prasītu daudz darba, lai to paveiktu manuāli, taču šajā gadījumā darbs tika ne tikai ātrāk apstrādāts AWS Lambda horizontālās mērogojamības dēļ, bet arī nemanāmi palielināts un samazināts, tādējādi optimizējot uzņēmuma mākoņa rēķinu.

Papildus atbildēm uz failiem, kas augšupielādēti S3, lambdas var izraisīt citi avoti, piemēram, ieraksti tiek ievietoti DynamoDB datu bāzē un analītiskās informācijas straumēšana no Amazon Kinesis. Mēs aplūkosim 2. daļā redzamo piemēru ar DynamoDB.

AWS Lambda darbojas Java

Tagad, kad jūs kaut ko zināt par skaitļošanu bez servera un AWS Lambda, es jums palīdzēsim izveidot Java AWS Lambda funkciju.

Lejupielādēt Iegūstiet šīs apmācības parauga lietojumprogrammas koda avota kodu "Skaitļošana bez servera ar AWS Lambda". Izveidoja Steven Haines JavaWorld.

Lambda funkciju ieviešana

Funkciju Lambda var rakstīt vienā no diviem veidiem:

  • Funkcija var saņemt ievades straumi klientam un rakstīt izejas straumē atpakaļ klientam.
  • Funkcija var izmantot iepriekš definētu saskarni, tādā gadījumā AWS Lambda automātiski deserializēs ievades straumi objektam, nodos to jūsu funkcijai un sērijveidos jūsu funkcijas atbildi, pirms to atgriezīs klientam.

Vieglākais veids, kā ieviest AWS Lambda funkciju, ir iepriekš definēta interfeisa izmantošana. Java gadījumā vispirms projektā jāiekļauj šāda AWS Lambda pamata bibliotēka (ņemiet vērā, ka šajā piemērā tiek izmantots Maven):

 com.amazonaws aws-lambda-java-core 1.1.0 

Pēc tam lieciet savai klasei ieviest šādu saskarni:

Saraksts 1. RequestHandler.java

 publiskā saskarne RequestHandler {/ ** * Apstrādā Lambda funkcijas pieprasījumu * @param input Lambda funkcijas ievade * @param context Lambda izpildes vides konteksta objekts. * @return Funkcijas Lambda izeja * / public O handleRequest (I ievade, konteksta konteksts); } 

The RequestHandler interfeiss nosaka vienu metodi: handRequest (), kuram tiek nodots ievades objekts un a Konteksts objektu un atgriež izvades objektu. Piemēram, ja jūs definētu a Pieprasījums klase un a Atbilde klasē, jūs varētu ieviest savu lambda šādi:

 publiskā klase MyHandler īsteno RequestHandler {public Response handleRequest (pieprasījuma pieprasījums, konteksta konteksts) {...}} 

Alternatīvi, ja vēlaties apiet iepriekš noteikto interfeisu, varat manuāli rīkoties ar InputStream un OutputStream pats, ieviešot metodi ar šādu parakstu:

 public void handleRequest (InputStream inputStream, OutputStream outputStream, Context context) iemet IOException {...} 

The Konteksts objekts sniedz informāciju par jūsu funkciju un vidi, kurā tā darbojas, piemēram, funkcijas nosaukumu, tās atmiņas ierobežojumu, reģistrētāju un atlikušo laiku milisekundēs, kas funkcijai jāpabeidz, pirms AWS Lambda to nogalina.

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