Ohjelmointi

Palvelimeton tietojenkäsittely AWS Lambdalla, osa 2

Tämän artikkelin alkupuoliskolla oli yleiskatsaus AWS Lambda -palvelimella tapahtuvaan palvelimettomaan laskentaan, mukaan lukien AWS Lambda -toimintojen rakentaminen, käyttöönotto ja testaus Java-esimerkkisovelluksessa. Osassa 2 opit integroimaan Lambda-toiminnot ulkoiseen tietokantaan, tässä tapauksessa DynamoDB. Sitten käytämme AWS SDK: ta Lambda-toimintojen kutsumiseen esimerkkisovelluksestamme.

AWS Lambda ja DynamoDB

DynamoDB on NoSQL-dokumenttikauppa, jota isännöi Amazon Web Services (AWS). DynamoDB määrittelee tietojen abstraktit taulukoiksi, jotka hyväksyvät yleiset tietokantatoiminnot, kuten lisäys, nouto, kysely, päivitys ja poisto. Kuten monien muiden NoSQL-tietokantojen kohdalla, DynamoDB: n mallia ei ole korjattu, joten joillakin saman taulukon kohteilla voi olla kenttiä, joita toiset eivät.

Yksi DynamoDB: n parhaista ominaisuuksista on porrastettu hinnoittelumalli. Toisin kuin AWS Relational Database Service (RDS), jossa AWS hallinnoi tietokantasi käyttämällä maksamiasi EC2-ilmentymiä, DynamoDB on pay-as-you-go. Maksat käyttämästäsi tallennustilasta ja kyselyidesi suoritustasosta, mutta et maksa suoraan mistään taustalla olevista virtuaalikoneista. Lisäksi AWS antaa sinulle ilmaisen tason, joka tukee jopa 25 Gt tilaa ja riittävän läpijuoksun jopa 200 miljoonan pyynnön suorittamiseen kuukaudessa.

Palvelimettomassa laskennassa AWS Lambdalla, osa 1, kehitimme yksinkertaisen, palvelimettoman Java-sovelluksen, joka käyttää Lambda-toimintoja. Voit ladata GetWidgetHandler-sovelluksen lähdekoodin milloin tahansa. Jos et ole vielä lukenut osaa 1, suosittelen tutustumaan sovelluskoodiin ja esimerkkeihin kyseisestä artikkelista ennen jatkamista.

Ensimmäinen askel on määrittää DynamoDB-tietokanta AWS-konsolillemme. Sen jälkeen päivitämme get-widget toiminto osasta 1 hakeaksesi widgetin DynamoDB-taulukosta.

Määritä DynamoDB-tietokanta AWS: ssä

Aloitetaan luomalla DynamoDB-taulukko. Napsauta AWS-konsolissa Palvelut ja valitse tietokantaosasta DynamoDB kuvan 1 mukaisesti.

Steven Haines

Käynnistyksen jälkeen näet DynamoDB-kojelaudan. Klikkaa Luo taulukko -painiketta aloittaaksesi taulukon luomisen, kuten kuvassa 2.

Steven Haines

Nyt näet kuvassa 3 esitetyn sivun.

Steven Haines

Anna taulukolle nimi (tässä tapauksessa "Widget") ja aseta ensisijaiseksi avaimeksi id, jättäen sen nimellä Merkkijono. Paina Luoda Kun olet valmis, sinut ohjataan DynamoDB-taulukoiden sivulle. Jos haluat siirtyä tälle sivulle tulevaisuudessa, valitse Palvelut -> DynamoDBja napsauta Taulukot.

Steven Haines

Luomme merkinnän manuaalisesti uuteen Widget-taulukkoon, joten napsauta Luo kohde painike, joka näkyy kuvassa 5.

Steven Haines

DynamoDB täyttää Luo kohde -sivun valmiiksi id ala. Anna helposti muistettava tunnus, kuten "1". Paina seuraavaksi plusmerkkiä (+) uuden tunnuksen vieressä ja lisää uusi kenttä nimeltä nimi. Anna arvo arvolle nimi kenttä, kuten "Widget 1". Lehdistö Tallentaa kun olet valmis.

Päivitä GetWidgetHandler-luokka

Kun tietokannassamme on tietoja, seuraava asia, joka meidän on tehtävä, on päivittää GetWidgetHandler luokka osasta 1. Aloitetaan lisäämällä DynamoDB-riippuvuus alkuperäiseen POM-tiedostoon. Päivitetty pom.xml tiedosto näkyy luettelossa 1.

Listaus 1. pom.xml (päivitetty DynamoDB-riippuvuuteen)

 4.0.0 com.javaworld.geekcap aws-lambda-java jar 1.0-SNAPSHOT aws-lambda-java //maven.apache.org 1.8 UTF-8 com.amazonaws aws-lambda-java-core 1.1.0 com.amazonaws aws -java-sdk-dynamodb 1.11.135 junit junit 4.12 testi org.apache.maven.plugins maven-compiler-plugin 2.0.2 $ {java.version} $ {java.version} org.apache.maven.plugins maven-shadow -laajennus 2.3 väärä paketin sävy 

Listaus 1 lisää aws-java-sdk-dynamodb riippuvuus POM-tiedostosta osasta 1. Luettelossa 2 näkyy päivitetty GetWidgetHandler luokassa.

Listaus 2. GetWidgetHandler.java (päivitetty lataamaan tietoja DynamoDB: ltä)

 paketti com.javaworld.awslambda.widget.handlers; tuonti com.amazonaws.services.dynamodbv2.AmazonDynamoDB; tuo com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; tuo com.amazonaws.services.dynamodbv2.document.DynamoDB; tuo com.amazonaws.services.dynamodbv2.document.Item; tuo com.amazonaws.services.dynamodbv2.document.Table; tuo com.amazonaws.services.lambda.runtime.Context; tuo com.amazonaws.services.lambda.runtime.RequestHandler; tuo com.javaworld.awslambda.widget.model.Widget; tuo com.javaworld.awslambda.widget.model.WidgetRequest; public class GetWidgetHandler toteuttaa RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, Context context) {// palauta uusi Widget (widgetRequest.getId (), "My Widget" + widgetRequest.getId ()); // Luo yhteys DynamoDB AmazonDynamoDB -asiakasohjelmaan = AmazonDynamoDBClientBuilder.defaultClient (); DynamoDB dynamoDB = uusi DynamoDB (asiakas); // Hanki viittaus Widget-taulukon taulukotaulukkoon = dynamoDB.getTable ("Widget"); // Hanki tuotteemme ID-nimikkeellä item = table.getItem ("id", widgetRequest.getId ()); if (item! = null) {System.out.println (item.toJSONPretty ()); // Palauta uusi Widget-objekti Palauta uusi Widget (widgetRequest.getId (), item.getString ("nimi")); } else {return new Widget (); }}} 

Tärkein käyttöliittymä DynamoDB: lle on DynamoDB esine. Voit luoda a DynamoDB tarvitsemme esimerkiksi DynamoDB-asiakkaan. Koska Lambda-toiminto toimii AWS: ssä, meidän ei tarvitse antaa kirjautumistietoja, joten voimme käyttää oletusasiakasta. Huomaa, että voimme tehdä kyselyn tietokannasta vain ilman kirjautumistietoja, koska get-widget-rooli osasta 1 on dynamodb: GetItem lupa.

Alkaen DynamoDB esimerkiksi voimme soittaa getTable ("Widget") hakea a Pöytä ilmentymä. Sitten voimme soittaa getItem () on Pöytä esimerkiksi välittämällä sille haettavan alkion ensisijainen avain. Jos on kohde, jolla on määritetty ensisijainen avain, se palauttaa kelvollisen vastauksen; muuten se palaa tyhjä. Tuote luokka tarjoaa pääsyn vasteparametreihin, joten viimeistelemme toteutuksen luomalla uuden Widget objekti, jonka nimi on ladattu DynamoDB: ltä.

lataa Hanki koodi Hanki päivitetyn GetWidgetHandler-sovelluksen koodi. Luonut Steven Haines JavaWorldille.

DynamoDB: n kysely DynamoDBMapperilla

On olemassa useita sovellusliittymiä DynamoDB: n kyselyyn RESTful-palvelupuhelusta yllä olevaan matalan tason rajapintaan pariin ylemmän tason rajapintoihin. Yksi suosituimmista käyttöliittymistä on DynamoDBMapper. Tämä käyttöliittymä tarjoaa samanlaisen rakenteen kuin mitä saatat löytää kartoitettaessa objekteja relaatiotietoihin horrostilassa. Tarkastellaan lyhyesti, kuinka a Widget DynamoDB: ltä DynamoDBMapper API.

Ensimmäinen asia, joka meidän on tehtävä, on lisätä muutama merkintä Widget luokka, joka näkyy luettelossa 3.

Listaus 3. Widget.java (päivitetty DynamoDBMapper-merkinnöillä)

 paketti com.javaworld.awslambda.widget.model; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; @DynamoDBTable (tableName = "Widget") julkisen luokan Widget {private String id; yksityinen merkkijono nimi; public Widget () {} public Widget (String id) {this.id = id; } public Widget (String id, String name) {this.id = id; tämä.nimi = nimi; } @DynamoDBHashKey (attributeName = "id") public String getId () {return ID; } public void setId (String id) {this.id = id; } @DynamoDBAttribute (attributeName = "nimi") public String getName () {return name; } public void setName (Merkkijonon nimi) {this.name = nimi; }} 

DynamoDBTable merkinnällä määritetään sen DynamoDB-taulukon nimi, johon Widget karttoja. DynamoDBHashKey -merkintä tunnistaa ensisijaisen avaimen Widget pöytä. Ja DynamoDBAttribute merkintä tunnistaa muut luokkamääritteet, jotka yhdistetään DynamoDB: n tietokannan määritteisiin. Jos sinulla on muita määritteitä, jotka haluat jättää huomiotta, voit lisätä ne @DynamoDBIgnore merkintä.

Kanssa Widget luokka on merkitty, voimme nyt päivittää GetWidgetHandler luokan käyttää DynamoDBMapper, joka näkyy luettelossa 4.

Listaus 4. GetWidgetHandler.java (päivitetty DynamoDBMapperillä)

 paketti com.javaworld.awslambda.widget.handlers; tuonti com.amazonaws.services.dynamodbv2.AmazonDynamoDB; tuo com.amazonaws.services.dynamodbv2.AmazonDynamoDBClientBuilder; tuo com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper; tuo com.amazonaws.services.lambda.runtime.Context; tuo com.amazonaws.services.lambda.runtime.RequestHandler; tuo com.javaworld.awslambda.widget.model.Widget; tuo com.javaworld.awslambda.widget.model.WidgetRequest; public class GetWidgetHandler toteuttaa RequestHandler {@Override public Widget handleRequest (WidgetRequest widgetRequest, kontekstikonteksti) {// Luo yhteys DynamoDB AmazonDynamoDB client = AmazonDynamoDBClientBuilder.defaultClient (); // Rakenna kartoitin DynamoDBMapper mapper = uusi DynamoDBMapper (asiakas); // Lataa widget ID: llä Widget-widget = mapper.load (Widget.class, widgetRequest.getId ()); if (widget == null) {// Emme löytäneet widgetiä tällä tunnuksella, joten palauta tyhjä Widget-konteksti.getLogger (). log. ("Widgetiä ei löydy tunnuksella:" + widgetRequest.getId () + "\ n "); palauta uusi widget (); } // Palauta widgetin palautus-widget; }} 

Aikaisemmassa (osa 1) versiossa GetWidgetHandler loimme AmazonDynamoDB esimerkiksi käyttämällä a AmazonDynamoDBClientBuilder.defaultClient () puhelu. Nyt käytämme kyseistä asiakasta alustamaan a DynamoDBMapper sen sijaan.

DynamoDBMapper-luokka tarjoaa pääsyn kyselyjen suorittamiseen, objektien lataamiseen tunnisteella, objektien tallentamiseen, objektien poistamiseen ja niin edelleen. Tässä tapauksessa ohitamme DynamoDBMapper widgetin luokka (Widget.luokka) ja sen ensisijainen avain. Jos DynamoDB: llä on Widget määritetyllä ensisijaisella avaimella se palauttaa sen; jos ei, se palauttaa nollan.

Rakenna ja lataa uusi JAR-tiedosto uudelleen avaamalla Lambda-toiminnon koontinäyttö ja napsauttamalla sitten Koodi -välilehti ja paina Lähetä. Kun lataat uudelleen ja soitat myöhemmin toimintoosi, AWS Lambda luo uuden säilön uudelle JAR-tiedostolle ja siirtää sen EC2-ilmentymään. Sinun pitäisi odottaa ensimmäisen ajon olevan hidas.

Jos satut kohtaamaan OutOfMemoryError kun testaat toimintoasi uudelleen, valitse Kokoonpano -välilehti ja avaa Lisäasetukset-osio. Täällä voit lisätä muistiasi alla olevan kuvan mukaisesti.

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