Ohjelmointi

Palvelimeton tietojenkäsittely AWS Lambdalla, osa 1

Palvelimeton tietojenkäsittely voi olla nykyään kuumin asia pilvipalveluissa, mutta mikä se on? Tämä kaksiosainen opetusohjelma alkaa yleiskatsauksella palvelimettomasta tietojenkäsittelystä - mistä se on, miksi sitä pidetään häiritsevänä perinteiselle pilvipalvelulle ja kuinka voit käyttää sitä Java-pohjaisessa ohjelmoinnissa.

Yleiskatsauksen jälkeen saat käytännön johdannon AWS Lambdaan, jota monet pitävät nykyään ensi-iltana Java-pohjaisena ratkaisuna palvelimettomaan tietojenkäsittelyyn. Osassa 1 käytät AWS Lambdaa ensimmäisen Lambda-toiminnon rakentamiseen, käyttöönottoon ja testaamiseen Javassa. Osassa 2 integroit Lambda-toimintosi DynamoDB: hen ja käytä sitten AWS SDK: ta Lambda-toimintojen kutsumiseen Java-sovelluksessa.

Mikä on palvelimeton tietojenkäsittely?

Viime vuonna puhuin erään yrityksen harjoittelijan kanssa erilaisista arkkitehtuurimalleista ja mainitsin palvelimettoman arkkitehtuurin. Hän huomautti nopeasti, että kaikki sovellukset vaativat palvelimen, eivätkä ne voi toimia ohut ilmassa. Harjoittelijalla oli piste, vaikka häneltä puuttuisi minun. Palvelimeton tietojenkäsittely ei ole maaginen alusta sovellusten suorittamiseen.

Itse asiassa, palvelimeton tietojenkäsittely tarkoittaa yksinkertaisesti sitä, että sinun, kehittäjän, ei tarvitse käsitellä palvelin. AWS Lambdan kaltaisen palvelimettoman tietokonealustan avulla voit rakentaa koodisi ja ottaa sen käyttöön tarvitsematta koskaan määrittää tai hallita taustalla olevia palvelimia. Käyttöyksikkösi on koodisi; ei koodia isännöivä säilö tai koodia ajava palvelin, vaan yksinkertaisesti itse koodi. Tuottavuuden kannalta on selvää hyötyä koodin tallennuspaikan ja suoritusympäristön hallinnan yksityiskohtien purkamisesta. Palvelimettomat laskennat hinnoitellaan myös suoritustietojen perusteella, joten on myös taloudellinen etu.

Mitä AWS Lambda maksaa?

Tämän kirjoituksen aikaan AWS Lambdan hintataso perustuu toteutusten lukumäärään ja toteutuksen kestoon:

  • Ensimmäiset miljoonat teloituksesi kuukaudessa ovat ilmaisia, sitten maksat sen jälkeen 0,20 dollaria per miljoona teloitusta (0,0000002 dollaria per pyyntö).
  • Kesto lasketaan siitä hetkestä, kun koodi alkaa suorittaa, kunnes se palauttaa tuloksen, pyöristettynä lähimpään 100 ms: iin. Laskutettu määrä perustuu toiminnolle osoitetun RAM-muistin määrään, jossa hinta on 0,00001667 dollaria jokaista gigatavun sekuntia kohden.

Hinnoittelun yksityiskohdat ja ilmaisten tasojen allokoinnit ovat hieman monimutkaisempia kuin yleiskatsaus antaa ymmärtää. Käy hintatasossa ja käy läpi muutama hinnoittelumalli.

Saadaksesi käsityksen palvelimettoman tietojenkäsittelyn toiminnasta, aloitetaan palvelimettoman tietojenkäsittelyn mallista, joka on esitetty kuvassa 1.

Steven Haines

Tässä on palvelimeton suoritusmalli pähkinänkuoressa:

  1. Asiakas pyytää palvelimettomalle tietokonealustalle tietyn toiminnon suorittamista.
  2. Palvelimeton tietokonealusta tarkistaa ensin, toimiiko toiminto jollakin sen palvelimista. Jos toiminto ei ole vielä käynnissä, alusta lataa toiminnon tietovarastosta.
  3. Alusta ottaa sitten toiminnon käyttöön yhdelle palvelimestaan, jotka on esiasetettu toteutusympäristöllä, joka voi suorittaa toiminnon.
  4. Se suorittaa toiminnon ja sieppaa tuloksen.
  5. Se palauttaa tuloksen takaisin asiakkaalle.

Joskus palvelimetonta laskentaa kutsutaan toiminnoksi palveluna (FaaS), koska rakentamasi koodin tarkkuus on toiminto. Alusta suorittaa toiminnon omalla palvelimellaan ja organisoi prosessin toimintopyyntöjen ja vastausten välillä.

Nanopalvelut, skaalautuvuus ja hinta

Palvelimettomassa laskennassa on todella kolme asiaa: sen nanopalveluarkkitehtuuri; tosiasia, että se on käytännössä äärettömän skaalautuva; ja siihen lähes ääretön skaalautuvuuteen liittyvä hinnoittelumalli. Kaivamme kaikki nämä tekijät.

Nanopalvelut

Olet kuullut mikropalveluista, ja tiedät todennäköisesti 12-tekijäisistä sovelluksista, mutta palvelimettomat toiminnot vievät paradigman hajottaa komponentti sen osiin kokonaan uudelle tasolle. Termi "nanopalvelut" ei ole alalla tunnustettu termi, mutta idea on yksinkertainen: jokaisen nanopalvelun tulisi toteuttaa yksi toimi tai vastuu. Esimerkiksi, jos haluat luoda widgetin, luomistyö olisi sen oma nanopalvelu; jos haluat hakea widgetin, haku olisi myös nanopalvelu; ja jos haluat tehdä tilauksen widgetille, se olisi vielä yksi nanopalvelu.

Nanopalveluarkkitehtuurin avulla voit määrittää sovelluksesi erittäin hienorakeisella tasolla. Samoin kuin testiohjattu kehitys (joka auttaa välttämään ei-toivottuja sivuvaikutuksia kirjoittamalla koodisi yksittäisten testien tasolla), nanopalveluarkkitehtuuri kannustaa määrittelemään sovelluksesi erittäin hienorakeisten ja erityisten toimintojen suhteen. Tämä lähestymistapa lisää selkeyttä rakentamassasi ja vähentää uuden koodin ei-toivottuja sivuvaikutuksia.

Mikropalvelut vs. nanopalvelut

Mikroservices kannustaa meitä hajottamaan sovelluksen palvelujen kokoelmaksi, joista kukin suorittaa tietyn tehtävän. Haasteena on, ettei kukaan ole oikeastaan ​​määrittänyt sitä soveltamisala mikropalvelusta. Seurauksena on, että määritämme mikropalvelut kokoelmaksi asiaan liittyviä palveluita, jotka kaikki ovat vuorovaikutuksessa saman tietomallin kanssa. Käsitteellisesti, jos sinulla on matalan tason toiminnallisuus vuorovaikutuksessa tietyn tietomallin kanssa, toiminnallisuuden tulisi mennä johonkin siihen liittyvistä palveluista. Korkean tason vuorovaikutusten tulisi soittaa palvelulle sen sijaan, että kysyttäisiin suoraan tietokannasta.

Palvelimettomassa tietojenkäsittelyssä käydään jatkuvasti keskustelua siitä, rakennetaanko Lambda-toiminnot mikro- tai nanopalveluiden tasolla. Hyvä uutinen on, että voit melko helposti rakentaa toimintojasi kummallakin tarkkuudella, mutta mikropalvelustrategia vaatii hieman ylimääräistä reitityslogiikkaa pyyntösi käsittelijässä.

Suunnittelun näkökulmasta palvelimettomien sovellusten tulisi olla hyvin määriteltyjä ja puhtaita. Käyttöönoton näkökulmasta sinun on hallittava huomattavasti enemmän käyttöönottoja, mutta sinulla on myös mahdollisuus ottaa toimintojen uudet versiot käyttöön erikseen vaikuttamatta muihin toimintoihin. Palvelimeton tietojenkäsittely soveltuu erityisen hyvin suurten tiimien kehitykseen, jossa se voi auttaa kehittämisprosessia helpommassa ja koodissa vähemmän virhealtista.

Skaalautuvuus

Uuden arkkitehtonisen paradigman käyttöönoton lisäksi palvelimettomat tietokonealustat tarjoavat käytännössä loputtoman skaalautuvuuden. Sanon "käytännössä", koska sellaista ei ole todella ääretön skaalautuvuus. Kaikista käytännöllisistä syistä palvelimettomat tietojenkäsittelypalvelujen tarjoajat, kuten Amazon, pystyvät kuitenkin käsittelemään enemmän kuormitusta kuin voisit heittää heille. Jos hallitsisit omien palvelimiesi (tai pilvipohjaisten virtuaalikoneiden) laajentamisen vastaamaan lisääntynyttä kysyntää, sinun on seurattava käyttöä, tunnistettava, milloin aloittaa enemmän palvelimia, ja lisätä lisää palvelimia klusteriin oikeaan aikaan. Samoin kun kysyntä väheni, sinun on vähennettävä manuaalisesti. Palvelimettoman tietojenkäsittelyn avulla kerrot palvelimettomalle tietokonealustalle enimmäismäärän samanaikaisia ​​toimintopyyntöjä, jotka haluat suorittaa, ja alusta tekee skaalauksen puolestasi.

Hinnoittelu

Lopuksi palvelimettoman laskennallisen hinnoittelumallin avulla voit skaalata pilvilaskusi käytön perusteella. Kun sinulla on vähän käyttöä, laskusi on pieni (tai nolla, jos pysyt vapaalla alueella). Tietysti laskusi kasvaa käytön myötä, mutta toivottavasti sinulla on myös uusia tuloja korkeamman pilvilaskusi tueksi. Sitä vastoin, jos hallinnoit omia palvelimiasi, joudut maksamaan peruskustannukset vaaditun vähimmäismäärän palvelimia varten. Kun käyttö lisääntyy, suurennat koko palvelimien lisäyksillä yksittäisten toimintokutsujen sijaan. Palvelimettoman laskennan hinnoittelumalli on suoraan verrannollinen käyttöösi.

AWS Lambda palvelimettomaan tietojenkäsittelyyn

AWS Lambda on palvelimeton tietokonealusta, joka on toteutettu Amazon Web Services -alustojen, kuten EC2 ja S3, päällä. AWS Lambda salaa ja tallentaa koodisi S3: een. Kun funktiota pyydetään suoritettavaksi, se luo "säilön" ajonaikaisia ​​määrityksiäsi käyttäen, sijoittaa sen johonkin laskentatilan EC2-ilmentymiin ja suorittaa kyseisen toiminnon. Prosessi on esitetty kuvassa 2.

Steven Haines

Kun luot Lambda-toiminnon, määrität sen AWS Lambdassa määrittämällä esimerkiksi ajonaikaisen ympäristön (käytämme tässä artikkelissa Java 8: ta), kuinka paljon muistia sille varataan, identiteetin ja käyttöoikeuksien hallinnan roolit sekä menetelmän suorittaa. AWS Lambda käyttää määrityksiäsi säilön määrittämiseen ja säilön asentamiseen EC2-ilmentymään. Sitten se suorittaa valitsemasi menetelmän paketin, luokan ja menetelmän järjestyksessä.

Tämän kirjoituksen ajankohtana voit rakentaa Lambda-toimintoja solmuihin, Java-, Python- ja viimeksi C # -järjestelmiin. Tässä artikkelissa käytämme Java.

Mikä on Lambda-toiminto?

Kun kirjoitat koodia, joka on suunniteltu toimimaan AWS Lambdassa, kirjoitat toimintoja. Termi toimintoja tulee toiminnallisesta ohjelmoinnista, joka on peräisin lambda-laskelmasta. Perusidea on laatia sovellus toimintojen kokoelmana, jotka ovat menetelmiä, jotka hyväksyvät argumentit, laskevat tuloksen ja joilla ei ole ei-toivottuja sivuvaikutuksia. Toiminnallisessa ohjelmoinnissa käytetään matemaattista lähestymistapaa koodin kirjoittamiseen, jonka voidaan osoittaa olevan oikea. Vaikka on hyvä pitää toiminnallinen ohjelmointi mielessä kirjoittaessasi koodia AWS Lambdalle, kaikki mitä sinun on todella ymmärrettävä, on, että toiminto on yhden menetelmän lähtökohta, joka hyväksyy syöttöobjektin ja palauttaa lähtöobjektin.

Palvelimettomat suoritustilat

Vaikka lambda-toiminnot voivat toimia synkronisesti, kuten edellä on kuvattu, ne voivat myös toimia asynkronisesti ja vastauksena tapahtumiin. Voit esimerkiksi määrittää Lambdan toimimaan aina, kun tiedosto ladataan S3-ämpäriin. Tätä kokoonpanoa käytetään joskus kuvan tai videon käsittelyyn: kun uusi kuva ladataan S3-ämpäriin, Lambda-toiminto kutsutaan kuvaan viittaamalla sen käsittelyyn.

Olen työskennellyt erittäin suuren yrityksen kanssa, joka hyödynsi tätä ratkaisua valokuvaajille, jotka kattoivat maratonin. Valokuvaajat olivat kurssilla ottamassa valokuvia. Kun muistikortit olivat täynnä, he lataivat kuvat kannettavaan tietokoneeseen ja lataivat tiedostot S3: een. Kun kuvia ladattiin, Lambda-toiminnot suoritettiin koon muuttamiseksi, vesileimaksi ja kunkin kuvan viitteen lisäämiseksi sen juoksijaan tietokannassa.

Kaiken tämän tekeminen vaatii paljon työtä manuaalisesti, mutta tässä tapauksessa työ ei vain prosessoitu nopeammin AWS Lambdan vaakasuuntaisen skaalautuvuuden vuoksi, vaan myös skaalautuu saumattomasti ylös ja alas, mikä optimoi yrityksen pilvilaskun.

Sen lisäksi, että vastaat S3: een ladattuihin tiedostoihin, lambdas voidaan laukaista muilla lähteillä, kuten DynamoDB-tietokantaan lisättävillä tietueilla ja analyyttisen tiedon suoratoistolla Amazon Kinesis -palvelusta. Tarkastellaan esimerkkiä DynamoDB: stä osassa 2.

AWS Lambda toimii Java-tilassa

Nyt kun tiedät vähän palvelimettomasta tietojenkäsittelystä ja AWS Lambdasta, opastan sinut rakentamaan AWS Lambda -toiminnon Java-järjestelmässä.

lataa Hanki koodin lähdekoodi tämän opetusohjelman "Palvelimettomat laskelmat AWS Lambdalla" -sovelluksen esimerkkisovellukselle. Luonut Steven Haines JavaWorldille.

Lambda-toimintojen toteuttaminen

Voit kirjoittaa Lambda-toiminnon kahdella tavalla:

  • Toiminto voi vastaanottaa tulovirran asiakkaalle ja kirjoittaa lähtevirtaan takaisin asiakkaalle.
  • Toiminto voi käyttää ennalta määritettyä käyttöliittymää, jolloin AWS Lambda deserialisoi tulovirran automaattisesti objektille, välittää sen funktiollesi ja sarjoittaa toiminnon vastauksen ennen palauttamista asiakkaalle.

Helpoin tapa toteuttaa AWS Lambda -toiminto on käyttää ennalta määritettyä käyttöliittymää. Java-käyttöjärjestelmässä sinun on ensin sisällytettävä seuraava AWS Lambda -ydinkirjasto projektiisi (huomaa, että tässä esimerkissä käytetään Mavenia):

 com.amazonaws aws-lambda-java-core 1.1.0 

Anna seuraavaksi luokallesi toteuttaa seuraava käyttöliittymä:

Listaus 1. RequestHandler.java

 julkinen käyttöliittymä RequestHandler {/ ** * käsittelee Lambda-toimintopyynnön * @param-tulo Lambda-toiminnon tulo * @param-konteksti Lambda-suoritusympäristön kontekstiobjekti. * @return Lambda-funktion ulostulo * / public O handleRequest (I-syöte, kontekstikonteksti); } 

RequestHandler käyttöliittymä määrittelee yhden menetelmän: kahvaRequest (), joka välitetään syöttöobjekti ja a Asiayhteys ja palauttaa tulosobjektin. Jos esimerkiksi määrität a Pyyntö luokka ja a Vastaus luokan, voit toteuttaa lambda seuraavasti:

 julkinen luokka MyHandler toteuttaa RequestHandler {public Response handleRequest (pyyntöpyyntö, asiayhteys) {...}} 

Vaihtoehtoisesti, jos haluat ohittaa ennalta määritetyn käyttöliittymän, voit käsitellä sitä manuaalisesti InputStream ja OutputStream itse, toteuttamalla menetelmä, jolla on seuraava allekirjoitus:

 public void handleRequest (InputStream inputStream, OutputStream outputStream, Context context) heittää IOExceptionin {...} 

Asiayhteys object tarjoaa tietoja toiminnostasi ja ympäristöstä, jossa se toimii, kuten toiminnon nimi, sen muistiraja, logger ja jäljellä oleva aika millisekunteina, joka toiminnon on suoritettava ennen kuin AWS Lambda tappaa sen.

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