Programovanie

Výpočty bez servera s AWS Lambda, časť 1

Výpočty bez serverov môžu byť dnes v cloudových výpočtoch najhorúcejšou vecou, ​​ale čo to vlastne je? Tento dvojdielny tutoriál začína prehľadom výpočtov bez serverov - od toho, čo to je, prečo sa to považuje za rušivé pre tradičné cloudové výpočty a ako by ste ich mohli použiť v programovaní založenom na prostredí Java.

Po prehľade získate praktické predstavenie AWS Lambda, ktoré je dnes považované za množstvo premiérových riešení založených na prostredí Java pre výpočty bez servera. V časti 1 použijete AWS Lambda na zostavenie, nasadenie a testovanie svojej prvej funkcie Lambda v jazyku Java. V časti 2 budete integrovať svoju funkciu Lambda s DynamoDB a potom pomocou AWS SDK vyvoláte funkcie Lambda v aplikácii Java.

Čo je to výpočet bez servera?

Minulý rok som hovoril so stážistom spoločnosti o rôznych architektonických vzoroch a spomenul architektúru bez servera. Rýchlo si všimol, že všetky aplikácie vyžadujú server a nemôžu bežať na serveri. Stážista mal zmysel, aj keď mu ten môj chýbal. Výpočty bez servera nie sú čarovnou platformou pre beh aplikácií.

V skutočnosti, výpočty bez servera jednoducho znamená, že vy, vývojár, nemusíte zaoberať sa server. Bezserverová výpočtová platforma, ako je AWS Lambda, vám umožní vytvoriť váš kód a nasadiť ho bez potreby konfigurácie alebo správy základných serverov. Jednotkou nasadenia je váš kód; nie kontajner, ktorý hostí kód, alebo server, ktorý kód prevádzkuje, ale iba samotný kód. Z hľadiska produktivity existujú zjavné výhody spočívajúce v odložení podrobností o tom, kde je uložený kód a ako je spravované prostredie na vykonávanie. Cena výpočtov bez servera je tiež založená na metrikách vykonávania, takže existuje aj finančná výhoda.

Čo stojí AWS Lambda?

V čase písania tohto článku cenová úroveň AWS Lambda závisí od počtu vykonaní a trvania vykonania:

  • Váš prvý milión exekúcií mesačne je zadarmo, potom potom zaplatíte 0,20 USD za milión exekúcií (0,0000002 USD za žiadosť).
  • Trvanie sa počíta od času, kedy sa váš kód začne vykonávať, kým vráti výsledok, zaokrúhlený na najbližších 100 ms. Účtovaná suma vychádza z množstva pamäte RAM pridelenej funkcii, pričom cena je 0,00001667 USD za každú GB-sekundu.

Podrobnosti o cenách a prideľovanie bezplatných úrovní sú o niečo komplikovanejšie, ako naznačuje prehľad. Navštívte cenovú úroveň a pozrite si niekoľko cenových scenárov.

Aby sme získali predstavu o tom, ako fungujú výpočty bez servera, začnime s modelom vykonávania výpočtov bez servera, ktorý je znázornený na obrázku 1.

Steven Haines

Tu je v skratke model vykonania bez servera:

  1. Klient zadá počítačovej platforme bez servera požiadavku na vykonanie konkrétnej funkcie.
  2. Počítačová platforma bez servera najskôr skontroluje, či je funkcia spustená na niektorom z jej serverov. Ak funkcia ešte nie je spustená, platforma načíta funkciu z úložiska údajov.
  3. Platforma potom nasadí funkciu na jeden zo svojich serverov, ktoré sú predkonfigurované s prostredím spustenia, ktoré dokáže túto funkciu spustiť.
  4. Vykoná funkciu a zachytí výsledok.
  5. Výsledok vráti späť klientovi.

Niekedy sa výpočty bez servera nazývajú Function as a Service (FaaS), pretože zrnitosť kódu, ktorý zostavujete, je funkcia. Platforma vykonáva vašu funkciu na vlastnom serveri a organizuje proces medzi požiadavkami na funkcie a reakciami na funkcie.

Nanoslužby, škálovateľnosť a cena

Na výpočte bez servera skutočne záleží na troch veciach: jeho architektúra nanoslužieb; skutočnosť, že je prakticky nekonečne škálovateľná; a cenový model spojený s takmer nekonečnou škálovateľnosťou. Budeme sa venovať každému z týchto faktorov.

Nanoslužby

Počuli ste o mikroslužbách a pravdepodobne viete o 12-faktorových aplikáciách, ale funkcie bez servera berú paradigmu rozbitia súčasti na jej základné časti na úplne novú úroveň. Pojem „nanoslužby“ nie je priemyselne uznávaným pojmom, ale myšlienka je jednoduchá: každá nanoslužba by mala implementovať jednu akciu alebo zodpovednosť. Napríklad, ak ste chceli vytvoriť widget, aktom vytvorenia by bola vlastná nanoslužba; ak by ste chceli načítať widget, činom vyhľadávania by bola tiež nanoslužba; a ak by ste chceli zadať objednávku pre widget, táto objednávka by bola ďalšou nanoslužbou.

Architektúra nanoslužieb vám umožňuje definovať vašu aplikáciu na veľmi jemnej úrovni. Podobne ako vývoj zameraný na testy (ktorý vám pomôže vyhnúť sa nežiaducim vedľajším účinkom napísaním kódu na úrovni jednotlivých testov), ​​architektúra nanoslužieb podporuje definovanie vašej aplikácie z hľadiska veľmi jemných a špecifických funkcií. Tento prístup zvyšuje prehľadnosť toho, čo staviate, a znižuje nežiaduce vedľajšie účinky nového kódu.

Mikroslužby vs nanoslužby

Microservices nás povzbudzuje, aby sme aplikáciu rozdelili do súboru služieb, z ktorých každý splní konkrétnu úlohu. Výzvou je, že nikto v skutočnosti nevyčíslil hodnotu rozsah mikroslužby. Vo výsledku definujeme mikroslužby ako kolekciu súvisiacich služieb, ktoré interagujú s rovnakým dátovým modelom. Koncepčne, ak máte funkčnosť na nízkej úrovni interagujúcu s daným dátovým modelom, potom by táto funkcionalita mala ísť do jednej z jej súvisiacich služieb. Interakcie na vysokej úrovni by mali skôr volať do služby, ako by sa mali priamo pýtať do databázy.

V oblasti serverových výpočtov prebieha diskusia o tom, či sa majú budovať funkcie Lambda na úrovni mikroslužieb alebo nanoslužieb. Dobrou správou je, že svoje funkcie môžete ľahko zostaviť buď s granularitou, ale stratégia mikroslužieb bude vyžadovať v spracovaní vašich požiadaviek trochu extra smerovacej logiky.

Z hľadiska dizajnu by mali byť aplikácie bez servera veľmi dobre definované a čisté. Z hľadiska nasadenia budete musieť spravovať podstatne viac nasadení, ale budete mať tiež možnosť nasadiť nové verzie svojich funkcií jednotlivo bez toho, aby to malo vplyv na ďalšie funkcie. Výpočty bez servera sú obzvlášť vhodné na vývoj vo veľkých tímoch, kde môžu pomôcť uľahčiť vývojový proces a znížiť pravdepodobnosť výskytu chyby v kóde.

Škálovateľnosť

Okrem zavedenia novej architektonickej paradigmy poskytujú serverové výpočtové platformy prakticky nekonečnú škálovateľnosť. Hovorím „prakticky“, pretože nič také neexistuje skutočne nekonečná škálovateľnosť. Pre všetky praktické účely však môžu poskytovatelia výpočtovej techniky bez serverov, ako je Amazon, zvládnuť väčšie zaťaženie, ako by ste na nich mohli hodiť. Ak by ste mali spravovať rozširovanie svojich vlastných serverov (alebo cloudových virtuálnych strojov), aby ste uspokojili zvýšený dopyt, budete musieť monitorovať využitie, identifikovať, kedy spustiť viac serverov, a pridať viac serverov do svojho klastra v pravý čas. Rovnako, keď sa znížil dopyt, bolo by potrebné manuálne zmenšiť plán. Vďaka výpočtom bez servera poviete svojej výpočtovej platforme bez servera maximálny počet súbežných požiadaviek na funkcie, ktoré chcete spustiť, a platforma za vás urobí škálovanie.

Ceny

A konečne, výpočtový model bez servera vám umožňuje škálovať vaše cloudové účty na základe využitia. Ak využívate svetlo, váš účet bude nízky (alebo nulový, ak zostanete vo voľnom výbehu). Váš účet sa samozrejme bude zvyšovať s používaním, ale dúfajme, že budete mať aj nové príjmy na podporu vášho vyššieho cloudového účtu. Ak by ste naopak mali spravovať svoje vlastné servery, museli by ste zaplatiť základné náklady na spustenie minimálneho požadovaného počtu serverov. Ako sa zvyšovalo využitie, zväčšovali by ste sa skôr po prírastkoch celých serverov, ako po prírastkoch jednotlivých volaní funkcií. Cenový model bez servera je priamo úmerný vášmu použitiu.

AWS Lambda pre výpočty bez servera

AWS Lambda je počítačová platforma bez servera implementovaná na platformách Amazon Web Services, ako sú EC2 a S3. AWS Lambda zašifruje a uloží váš kód do formátu S3. Keď sa požaduje spustenie funkcie, vytvorí "kontajner" pomocou vašich runtime špecifikácií, nasadí ju do jednej z inštancií EC2 vo svojej výpočtovej farme a vykoná túto funkciu. Postup je znázornený na obrázku 2.

Steven Haines

Keď vytvoríte funkciu Lambda, nakonfigurujete ju v aplikácii AWS Lambda a zadáte veci, ako je napríklad runtime prostredie (pre tento článok použijeme Java 8), koľko pamäte jej treba prideliť, role správy identity a prístupu a metódu na vykonať. AWS Lambda používa vašu konfiguráciu na nastavenie kontajnera a nasadenie kontajnera na inštanciu EC2. Potom vykoná vami zadanú metódu v poradí podľa balíka, triedy a metódy.

V čase písania tohto článku môžete vytvárať funkcie Lambda v Node, Java, Python a najnovšie aj v C #. Na účely tohto článku budeme používať jazyk Java.

Čo je funkcia Lambda?

Keď píšete kód určený na spustenie v AWS Lambda, píšete funkcie. Termín funkcie pochádza z funkčného programovania, ktoré vzniklo v počte lambda. Základnou myšlienkou je zostaviť aplikáciu ako súbor funkcií, čo sú metódy, ktoré prijímajú argumenty, počítajú výsledok a nemajú žiadne nežiaduce vedľajšie účinky. Funkčné programovanie zaujíma pri písaní kódu matematický prístup, o ktorom sa dá dokázať, že je správny. Aj keď je dobré mať pri písaní kódu pre AWS Lambda na pamäti funkčné programovanie, všetko, čo musíte skutočne pochopiť, je, že funkcia je vstupný bod pre jednu metódu, ktorý prijíma vstupný objekt a vracia výstupný objekt.

Režimy vykonávania bez servera

Zatiaľ čo funkcie Lambda môžu bežať synchrónne, ako je opísané vyššie, môžu tiež bežať asynchrónne a ako reakcia na udalosti. Môžete napríklad nakonfigurovať Lambdu tak, aby sa spustila vždy, keď sa súbor nahral do vedra S3. Táto konfigurácia sa niekedy používa na spracovanie obrazu alebo videa: keď sa do vedra S3 nahrá nový obrázok, na jeho spracovanie sa vyvolá funkcia Lambda s odkazom na obrázok.

Pracoval som s veľmi veľkou spoločnosťou, ktorá toto riešenie využila pre fotografov, ktorí absolvovali maratón. Fotografi boli na kurze fotografovania. Keď boli ich pamäťové karty plné, načítali obrázky do prenosného počítača a nahrali súbory na S3. Počas nahrávania obrázkov sa vykonávali funkcie Lambda na zmenu veľkosti, vodoznaku a pridanie odkazu na každý obrázok jeho bežcovi v databáze.

To všetko by si vyžadovalo veľa práce, aby ste ich dosiahli manuálne, ale v takom prípade sa práca nespracovala iba rýchlejšie kvôli horizontálnej škálovateľnosti AWS Lambda, ale aj bez problémov sa zmenšila nahor a späť nadol, čím sa optimalizoval cloudový účet spoločnosti.

Okrem odpovedí na súbory nahrané na S3 môžu byť lambdy spúšťané aj z iných zdrojov, ako sú záznamy vkladané do databázy DynamoDB a analytické informácie vysielané z Amazon Kinesis. Pozrime sa na príklad predstavujúci DynamoDB v 2. časti.

AWS Lambda funguje v Jave

Teraz, keď viete niečo o výpočtoch bez servera a AWS Lambda, vás prevediem zostavením funkcie AWS Lambda v Jave.

download Získajte kód Zdrojový kód vzorovej aplikácie pre tento tutoriál „Výpočty bez serverov s AWS Lambda.“ Vytvoril Steven Haines pre JavaWorld.

Implementácia funkcií Lambda

Funkciu Lambda môžete napísať jedným z dvoch spôsobov:

  • Funkcia môže prijímať vstupný tok do klienta a zapisovať do výstupného toku späť do klienta.
  • Funkcia môže používať preddefinované rozhranie. V takom prípade AWS Lambda automaticky deserializuje vstupný prúd do objektu, predá ho vašej funkcii a pred vrátením klientovi serializuje odpoveď vašej funkcie.

Najjednoduchší spôsob implementácie funkcie AWS Lambda je použitie preddefinovaného rozhrania. Pre Javu musíte do svojho projektu najskôr zahrnúť nasledujúcu základnú knižnicu AWS Lambda (všimnite si, že tento príklad používa Maven):

 com.amazonaws aws-lambda-java-core 1.1.0 

Ďalej nechajte svoju triedu implementovať nasledujúce rozhranie:

Zoznam 1. RequestHandler.java

 verejné rozhranie RequestHandler {/ ** * Spracováva požiadavku na funkciu Lambda * @param vstup Vstup funkcie Lambda * @param kontext Objekt kontextu prostredia vykonávania Lambda. * @return Výstup funkcie Lambda * / public O handleRequest (I input, Context context); } 

The RequestHandler rozhranie definuje jednu metódu: handleRequest (), ktorému je odovzdaný vstupný objekt a Kontext objekt a vráti výstupný objekt. Napríklad, ak by ste mali definovať a Žiadosť triedy a a Odozva triedy, svoju lambdu môžete implementovať nasledovne:

 verejná trieda MyHandler implementuje RequestHandler {public Response handleRequest (požiadavka na požiadavku, kontextový kontext) {...}} 

Prípadne, ak by ste chceli obísť preddefinované rozhranie, môžete manuálne zvládnuť InputStream a OutputStream sami, implementáciou metódy s týmto podpisom:

 public void handleRequest (InputStream inputStream, OutputStream outputStream, kontextový kontext) vyvolá IOException {...} 

The Kontext objekt poskytuje informácie o vašej funkcii a prostredí, v ktorom je spustená, napríklad názov funkcie, jej limit pamäte, jej záznamník a zostávajúci čas v milisekundách, ktorý musí funkcia dokončiť, kým ju program AWS Lambda nezabije.

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