Programování

Bezserverové výpočty s AWS Lambda, část 1

Výpočty bez serveru mohou být dnes nejžhavější věcí v cloudových výpočtech, ale co přesně to je? Tento dvoudílný výukový program začíná přehledem výpočetní techniky bez serveru - od toho, co to je, proč je považováno za rušivé pro tradiční cloudové výpočty a jak jej můžete použít v programování založeném na prostředí Java.

V návaznosti na přehled získáte praktické seznámení s AWS Lambda, který je dnes považován za mnoho premiérového řešení založeného na prostředí Java pro výpočet bez serveru. V části 1 použijete AWS Lambda k sestavení, nasazení a testování vaší první funkce Lambda v Javě. V části 2 integrujete svou funkci Lambda s DynamoDB a poté pomocí AWS SDK vyvoláte funkce Lambda v aplikaci Java.

Co je to výpočet bez serveru?

V loňském roce jsem mluvil se stážistou společnosti o různých architektonických vzorcích a zmínil se o architektuře bez serveru. Rychle si všiml, že všechny aplikace vyžadují server a nemohou běžet na vzduchu. Stážista měl pravdu, i když mu chyběl můj. Výpočty bez serveru nejsou kouzelnou platformou pro spouštění aplikací.

Ve skutečnosti, výpočet bez serveru jednoduše znamená, že vy, vývojář, nemusíte vypořádat se s server. Bezserverová výpočetní platforma, jako je AWS Lambda, vám umožní sestavit váš kód a nasadit ho, aniž byste museli konfigurovat nebo spravovat základní servery. Vaše jednotka nasazení je váš kód; ne kontejner, který je hostitelem kódu, nebo server, který kód spouští, ale jednoduše samotný kód. Z hlediska produktivity existují zjevné výhody odlehčení podrobností o tom, kde je uložen kód a jak je spravováno prováděcí prostředí. Výpočet bez serveru je také cenově založen na metrikách provádění, takže má také finanční výhodu.

Co AWS Lambda stojí?

V době psaní tohoto článku cenová úroveň AWS Lambda vychází z počtu provedení a doby trvání:

  • Váš první milion exekucí za měsíc je zdarma, poté poté zaplatíte 0,20 $ za milion exekucí (0,0000002 $ za žádost).
  • Doba trvání se počítá od okamžiku, kdy se váš kód začne spouštět, dokud nevrátí výsledek, zaokrouhlený na nejbližších 100 ms. Účtovaná částka je založena na množství paměti RAM přidělené funkci, přičemž cena je 0,00001667 USD za každou GB za sekundu.

Podrobnosti o cenách a přidělení bezplatných úrovní jsou o něco složitější, než naznačuje přehled. Navštivte cenovou úroveň a projděte si několik cenových scénářů.

Abychom získali představu o tom, jak funguje výpočet bez serveru, pojďme začít s modelem provádění výpočtu bez serveru, který je znázorněn na obrázku 1.

Steven Haines

Stručně řečeno, model provedení bez serveru:

  1. Klient odešle výpočetní platformě bez serveru požadavek na provedení konkrétní funkce.
  2. Počítačová platforma bez serveru nejprve zkontroluje, zda funkce běží na některém ze svých serverů. Pokud funkce ještě není spuštěna, platforma načte funkci z úložiště dat.
  3. Platforma poté nasadí funkci na jeden ze svých serverů, které jsou předkonfigurovány pomocí prováděcího prostředí, ve kterém lze funkci spustit.
  4. Spustí funkci a zachytí výsledek.
  5. Vrátí výsledek zpět klientovi.

Někdy se výpočet bez serveru nazývá Funkce jako služba (FaaS), protože granularita kódu, který vytváříte, je funkce. Platforma provádí vaši funkci na svém vlastním serveru a orchestruje proces mezi požadavky na funkce a odpověďmi na funkce.

Nanoslužby, škálovatelnost a cena

Na práci bez serveru skutečně záleží na třech věcech: architektura nanoservisů; skutečnost, že je prakticky nekonečně škálovatelná; a cenový model spojený s touto téměř nekonečnou škálovatelností. Budeme se zabývat každým z těchto faktorů.

Nanoslužby

Slyšeli jste o mikroslužbách a pravděpodobně víte o 12faktorových aplikacích, ale funkce bez serveru berou paradigma rozbití komponenty na její součásti na zcela novou úroveň. Pojem „nanoslužby“ není průmyslově uznávaným pojmem, ale myšlenka je jednoduchá: každá nanoslužba by měla implementovat jedinou akci nebo odpovědnost. Pokud byste například chtěli vytvořit widget, činem vytvoření by byla jeho vlastní nanoslužba; pokud byste chtěli načíst widget, čin vyhledávání by byl také nanoslužbou; a pokud byste chtěli zadat objednávku na widget, tato objednávka by byla další nanoslužbou.

Architektura nanoslužeb vám umožňuje definovat vaši aplikaci na velmi jemné úrovni. Podobně jako vývoj řízený testy (který vám pomůže vyhnout se nežádoucím vedlejším účinkům psaním kódu na úrovni jednotlivých testů), architektura nanoslužeb podporuje definování vaší aplikace z hlediska velmi jemných a specifických funkcí. Tento přístup zvyšuje jasnost toho, co vytváříte, a snižuje nežádoucí vedlejší účinky nového kódu.

Mikroslužby vs. nanoslužby

Microservices nás povzbuzuje, abychom rozdělili aplikaci do kolekce služeb, které každý splní určitý úkol. Výzvou je, že nikdo skutečně nevyčíslil rozsah mikroslužby. Výsledkem je, že definujeme mikroslužby jako kolekci souvisejících služeb, které interagují se stejným datovým modelem. Koncepčně, pokud máte funkčnost na nízké úrovni interagující s daným datovým modelem, měla by tato funkce přejít do jedné z jejích souvisejících služeb. Interakce na vysoké úrovni by měly provádět volání služby, spíše než přímé dotazy do databáze.

Ve výpočtech bez serveru probíhá debata o tom, zda stavět funkce Lambda na úrovni mikroslužeb nebo nanoslužeb. Dobrou zprávou je, že své funkce můžete snadno sestavit buď s granularitou, ale strategie mikroslužeb bude vyžadovat ve zpracování vašeho požadavku trochu extra logiky směrování.

Z pohledu designu by aplikace bez serveru měly být velmi dobře definované a čisté. Z hlediska nasazení budete muset spravovat podstatně více nasazení, ale budete mít také možnost nasazovat nové verze svých funkcí jednotlivě, aniž by to mělo dopad na další funkce. Výpočetní technika bez serveru je obzvláště vhodná pro vývoj ve velkých týmech, kde může pomoci usnadnit vývojový proces a kód méně náchylný k chybám.

Škálovatelnost

Kromě zavedení nového architektonického paradigmatu poskytují výpočetní platformy bez serveru prakticky nekonečnou škálovatelnost. Říkám „prakticky“, protože nic takového neexistuje skutečně nekonečná škálovatelnost. Pro všechny praktické účely však poskytovatelé výpočetní techniky bez serveru, jako je Amazon, zvládnou větší zátěž, než byste na ně mohli hodit. Pokud byste měli spravovat rozšiřování vlastních serverů (nebo cloudových virtuálních strojů), abyste uspokojili zvýšenou poptávku, budete muset sledovat využití, určit, kdy spustit více serverů a přidat do svého clusteru více serverů ve správný čas. Podobně, když klesla poptávka, budete muset ručně zmenšit. S výpočtem bez serveru řeknete své výpočetní platformě bez serveru maximální počet simultánních požadavků na funkce, které chcete spustit, a platforma provede škálování za vás.

Ceny

A konečně, výpočetní model bez serveru vám umožňuje škálovat cloudový účet podle využití. Pokud budete mít nízkou spotřebu, váš účet bude nízký (nebo nulový, pokud zůstanete ve volném výběhu). Váš účet se samozřejmě zvýší s využitím, ale doufejme, že budete mít také nové příjmy na podporu vašeho vyššího cloudového účtu. Naproti tomu, pokud byste měli spravovat své vlastní servery, museli byste zaplatit základní náklady na spuštění minimálního požadovaného počtu serverů. Jak se zvyšovalo využití, zvětšovali byste se v přírůstcích celých serverů, nikoli v přírůstcích jednotlivých volání funkcí. Cenový model bez serveru je přímo úměrný vašemu využití.

AWS Lambda pro výpočet bez serveru

AWS Lambda je výpočetní platforma bez serveru implementovaná na platformách Amazon Web Services, jako jsou EC2 a S3. AWS Lambda zašifruje a uloží váš kód do S3. Když je funkce spuštěna, vytvoří "kontejner" pomocí vašich specifikací běhového prostředí, nasadí ji do jedné z instancí EC2 ve své výpočetní farmě a provede tuto funkci. Proces je znázorněn na obrázku 2.

Steven Haines

Když vytvoříte funkci Lambda, nakonfigurujete ji v AWS Lambda a zadáte věci, jako je běhové prostředí (pro tento článek použijeme Java 8), kolik paměti k ní přidělit, role správy identit a přístupu a metoda pro vykonat. AWS Lambda používá vaši konfiguraci k nastavení kontejneru a nasazení kontejneru na instanci EC2. Potom provede metodu, kterou jste zadali, v pořadí podle balíčku, třídy a metody.

V době psaní tohoto článku můžete vytvářet funkce Lambda v Node, Java, Python a nejnověji v C #. Pro účely tohoto článku budeme používat Java.

Co je to funkce Lambda?

Když píšete kód navržený pro běh v AWS Lambda, píšete funkce. Termín funkce pochází z funkčního programování, které vzniklo v lambda kalkulu. Základní myšlenkou je sestavit aplikaci jako kolekci funkcí, což jsou metody, které přijímají argumenty, počítají výsledek a nemají žádné nežádoucí vedlejší účinky. Funkční programování zaujímá matematický přístup k psaní kódu, který lze prokázat jako správný. I když je dobré mít na paměti funkční programování, když píšete kód pro AWS Lambda, vše, co opravdu potřebujete pochopit, je, že funkce je vstupní bod s jednou metodou, který přijímá vstupní objekt a vrací výstupní objekt.

Režimy provádění bez serveru

Zatímco funkce Lambda mohou běžet synchronně, jak je popsáno výše, mohou také běžet asynchronně a v reakci na události. Můžete například nakonfigurovat Lambdu tak, aby se spouštěla ​​vždy, když byl soubor nahrán do kbelíku S3. Tato konfigurace se někdy používá pro zpracování obrazu nebo videa: když je nový obrázek nahrán do kbelíku S3, je vyvolána funkce Lambda s odkazem na obrázek pro jeho zpracování.

Pracoval jsem s velmi velkou společností, která toto řešení využila pro fotografy pokrývající maraton. Fotografové byli na kurzu a fotografovali. Jakmile byly jejich paměťové karty plné, načetly obrázky do notebooku a nahrály soubory na S3. Jak byly obrázky nahrány, byly provedeny funkce Lambda pro změnu velikosti, vodoznak a přidání odkazu pro každý obrázek na jeho běžec v databázi.

To vše by vyžadovalo spoustu práce, aby bylo možné provést ručně, ale v tomto případě se práce nejen rychleji zpracovávala kvůli horizontální škálovatelnosti AWS Lambda, ale také se plynule škálovala nahoru a zpět dolů, čímž se optimalizoval cloudový účet společnosti.

Kromě reakce na soubory nahrané na S3 mohou být lambdy spouštěny z jiných zdrojů, jako jsou záznamy vkládané do databáze DynamoDB a streamování analytických informací z Amazon Kinesis. Podíváme se na příklad představující DynamoDB v části 2.

AWS Lambda funguje v Javě

Nyní, když víte něco o výpočtech bez serveru a AWS Lambda, provedu vás vytvořením funkce AWS Lambda v Javě.

stáhnout Získat kód Zdrojový kód pro ukázkovou aplikaci pro tento výukový program „Výpočet bez serveru s AWS Lambda.“ Vytvořil Steven Haines pro JavaWorld.

Implementace funkcí Lambda

Funkci Lambda můžete napsat dvěma způsoby:

  • Funkce může přijímat vstupní proud do klienta a zapisovat do výstupního proudu zpět do klienta.
  • Funkce může používat předdefinované rozhraní, v takovém případě AWS Lambda automaticky deserializuje vstupní proud do objektu, předá jej vaší funkci a před vrácením klientovi serializuje odpověď vaší funkce.

Nejjednodušší způsob implementace funkce AWS Lambda je použití předdefinovaného rozhraní. Pro Javu musíte do projektu nejprve zahrnout následující základní knihovnu AWS Lambda (všimněte si, že tento příklad používá Maven):

 com.amazonaws aws-lambda-java-core 1.1.0 

Dále nechte svou třídu implementovat následující rozhraní:

Výpis 1. RequestHandler.java

 veřejné rozhraní RequestHandler {/ ** * Zpracovává požadavek na funkci Lambda * @param vstup Vstup funkce Lambda * @param kontext Objekt kontextu prostředí provádění Lambda. * @return Výstup funkce Lambda * / public O handleRequest (vstup I, kontext kontextu); } 

The RequestHandler rozhraní definuje jednu metodu: handleRequest (), kterému je předán vstupní objekt a Kontext objekt a vrátí výstupní objekt. Například pokud byste měli definovat a Žádost třída a Odezva třídy, můžete implementovat lambda následujícím způsobem:

 veřejná třída MyHandler implementuje RequestHandler {public Response handleRequest (požadavek požadavku, kontextový kontext) {...}} 

Alternativně, pokud jste chtěli obejít předdefinované rozhraní, můžete ručně zpracovat InputStream a Výstupní proud sami, implementací metody s následujícím podpisem:

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

The Kontext object provides information about your function and the environment in which it is running, such as the function name, its memory limit, its logger, and the amount of time time, in milliseconds, the function has to complete before AWS Lambda it kills.