Jak Quarkus spojuje imperativní a reaktivní programování

Tento rok plánujeme vážně rozvíjet témata kontejnerů, Cloud-Native Java a Kubernetes. Logickým pokračováním těchto témat bude představení frameworku Quarkus, již projednaného na Habru. Dnešní článek se nevěnuje tolik struktuře 'subatomární superrychlé Java', ale perspektivám, které Quarkus přináší do Enterprise.

Jak Quarkus spojuje imperativní a reaktivní programování

Java a JVM jsou stále mimořádně populární, ale při práci s bezserverovými technologiemi a cloudově orientovanými mikroservisy se Java a další jazyky pro JVM používají stále méně, protože zabírají příliš mnoho paměti a příliš pomalu se načítají, což je činí nevhodnými pro použití s krátkodobými kontejnery. Naštěstí se tato situace v současnosti začíná měnit díky Quarkus.

Superrychlá subatomární Java dosáhla nového levelu!

42 vydání, 8 měsíců práce komunity a 177 úžasných vývojářů – výsledkem toho všeho bylo vydání v listopadu 2019 Quarkus 1.0, vydání, které představuje důležitý mezník v rozvoji projektu a nabízí spoustu skvělých funkcí a možností (více o nich se lze dočíst v oznámení).

Dnes vám ukážeme, jak Quarkus spojuje modely imperativního a reaktivního programování na základě jednotného reaktivního jádra. Začneme krátkým exkurzem do historie, a poté podrobně prozkoumáme, v čem spočívá dualismus reaktivního jádra Quarkus a jak Javy-vývojáři mohou využít těchto výhod.

Mikroservisy, udržované událostmi architektury a bezserverové-Funkce – to všechno je dnes, co se nazývá, na vzestupu. V poslední době se vytváření cloudově orientovaných architektur stalo mnohem jednodušším a dostupnějším, přesto zůstávají určité problémy – zejména pro vývojáře v Javě. Například v případě serverless funkcí a mikroservisů existuje naléhavá potřeba zkrátit dobu spuštění, snížit spotřebu paměti a udělat jejich vývoj pohodlnějším a příjemnějším. Java v posledních letech provedla několik vylepšení, jako je vylepšená ergonomika pro kontejnery a další. Avšak dosáhnout normálního fungování Javy v kontejneru je stále obtížné. Proto začneme tím, že se podíváme na některé z vnitřních složitostí Javy, které se zejména projevují při vývoji kontejnerově orientovaných Java aplikací.

Nejprve se vraťme k historii.

Jak Quarkus spojuje imperativní a reaktivní programování

Témy a kontejnery

Od verze 8u131 začala Java více méně podporovat kontejnery díky vylepšením v ergonomických funkcích. Konkrétně nyní JVM ví, na kolika procesorových jádrech běží, a může odpovídajícím způsobem nastavit pooly vláken – obvykle pooly fork/join. To je bezpochyby skvělé, ale dejme tomu, že máme tradiční webovou aplikaci, která používá HTTP servlet a běží na Tomcat, Jetty a podobně. V důsledku toho tato aplikace vydává každému požadavku samostatné vlákno a umožňuje mu blokovat toto vlákno při čekání na vstupně-výstupní operace, například při dotazu na databázi, soubory nebo jiné služby. To znamená, že velikost takové aplikace závisí nikoli na počtu dostupných jader, ale na počtu souběžných požadavků. Kromě toho to znamená, že kvóty nebo limity v Kubernetes týkající se počtu jader tu příliš nepomohou, a věc nakonec skončí throttlingem.

Vyčerpání paměti

Toky – to paměť. A intra-kontejnerová omezení paměti rozhodně nejsou panaceou. Stačí jen začít zvyšovat počet aplikací a toků, a dříve či později se setkáte s kritickým nárůstem frekvence přepínání a tedy i s degradací výkonu. Kromě toho, pokud aplikace používá tradiční mikroslužbové frameworky, nebo se připojuje k DB, nebo vyžaduje kešování, nebo nějakým způsobem jinak spotřebovává paměť, zcela jistě potřebujete nástroj, který vám umožní nahlédnout dovnitř JVM a podívat se, jak spravuje paměť, aniž byste ji přitom zabili (například XX:+UseCGroupMemoryLimitForHeap). A přestože od Java 9 JVM naučila a přijímat cgroups a přizpůsobit se jim, rezervace a správa paměti zůstává poměrně složitou záležitostí.

Kvóty a limity

V Java 11 byla přidána podpora CPU-kvót (např. PreferContainerQuotaForCPUCount). Kubernetes také nabízí podporu limitů a kvót. Ano, to všechno dává smysl, ale pokud aplikace opět vyjde za vymezenou kvótu, opět se dostáváme k tomu, že velikost – stejně jako v případě tradičních Java aplikací – je určena počtem jader a s přiřazením jednoho vlákna na každý požadavek, tedy to všechno ve velké míře postrádá smysl.
Kromě toho, pokud použijeme kvóty a limity nebo funkce horizontálního (scale-out) škálování platformy, která leží na základě Kubernetes, problém se také nevyřeší sám o sobě. Jen prostě vynakládáme více zdrojů na řešení původního problému, nebo nakonec přijdeme k přečerpávání zdrojů. A pokud jde o vysoce zatížený systém v veřejném cloudovém prostředí, téměř s jistotou začínáme využívat více zdrojů, než je skutečně potřeba.

A co s tím vším dělat?

Pokud to vezmeme jednoduše, používejte asynchronní a neblokující knihovny pro vstup a výstup a frameworky jako Netty, Vert.x nebo Akka. Jsou mnohem lépe přizpůsobeny pro práci v kontejnerech díky své reaktivní povaze. Díky nebločenému vstupu a výstupu může jeden stejný vlákno zpracovávat více současných požadavků. Zatímco jeden požadavek čeká na výsledky vstupu a výstupu, vlákno, které ho zpracovává, se uvolňuje a bere si jiný požadavek. A když konečně přicházejí výsledky vstupu a výstupu, zpracování prvního požadavku pokračuje. Střídáním zpracování požadavků na stejném vlákně lze snížit celkový počet vláken a snížit spotřebu zdrojů na zpracování požadavků.

Při nebločeném vstupu a výstupu se počet jader stává klíčovým parametrem, protože to určuje, kolik vláken vstupu a výstupu může běžet paralelně. Při správném využití to umožňuje efektivně rozdělovat zátěž mezi jádry a vyrovnat se s vyššími zátěžemi s menšími zdroji.

Jak, a to je vše?

Ne, je tu ještě něco. Reaktivní programování pomáhá lépe využívat zdroje, ale také má svou cenu. Zejména, kód bude třeba přepsat podle principů nebločenosti a vyhnout se blokování vláken vstupu a výstupu. To je zcela jiný model vývoje a provádění. A přestože existuje řada užitečných knihoven, je to stále radikální změna ve způsobu myšlení.

Za prvé, musíte se naučit psát kód, který se vykonává asynchronně. Jakmile začnete používat nebločený vstup a výstup, musíte explicitně uvést, co se má stát při příjmu odpovědi na požadavek. Už není možné jen blokovat a čekat. Místo toho můžete předávat zpětné volání, používat reaktivní programování nebo pokračování. Ale to není vše: abyste mohli používat nebločený vstup a výstup, potřebujete také nebločené servery a klienty, a to ideálně na všech místech. V případě HTTP je to jednoduché, ale také existují databáze, souborové systémy a mnohem více.

A přestože totální průřezová reaktivita poskytuje maximální efektivitu, takový posun může být obtížné strávit v praxi. Proto je možnost kombinovat reaktivní a imperativní kód nezbytným předpokladem pro to, aby:

  1. Efektivně využívat zdroje na nejvíce zatížených směrech softwarového systému;
  2. Používat jednodušší styl kódu v jeho ostatních částech.

Představujeme Quarkus

V tom je vlastně podstata Quarkus – spojit reaktivní a imperativní modely v rámci jednoho běhového prostředí.

V základu Quarkus leží Vert.x a Netty, nad kterými je využívána celá řada reaktivních rámců a rozšíření, které mají pomoci vývojářům. Quarkus je určen k budování nejen HTTP mikroslužeb, ale i architektur řízených událostmi. Díky své reaktivní povaze velmi efektivně pracuje se systémy pro výměnu zpráv (Apache Kafka, AMQP atd.).

Celá finta spočívá v tom, jak využívat jeden a tentýž reaktivní motor jak pro imperativní, tak pro reaktivní kód.

Jak Quarkus spojuje imperativní a reaktivní programování

Quarkus s tím skvěle zachází. Volba mezi imperativním a reaktivním je jasná – použít pro obojí reaktivní jádro. A s čím velmi pomáhá, je rychlý neblokující kód, který zpracovává téměř vše, co prochází cyklem událostí (event-loop thread, také známý jako IO thread). Ale pokud máte klasické REST aplikace nebo aplikace na straně klienta, Quarkus má připravený imperativní model programování. Například podpora HTTP v Quarkus je postavena na využití neblokujícího a reaktivního motoru (Eclipse Vert.x a Netty). Všechny HTTP požadavky, které vaše aplikace obdrží, nejprve procházejí cyklem událostí (IO Thread) a poté jsou odeslány té části kódu, která spravuje požadavky. V závislosti na cíli může být kód správy požadavků volán v rámci samostatného vlákna (tzv. worker thread, používá se v případě servlettů a Jax-RS) nebo využít původní vstupně-výstupní vlákno (reaktivní trasa).

Jak Quarkus spojuje imperativní a reaktivní programování

Pro konektory systémů pro přenos zpráv se používají neblokující klienti, kteří pracují nad motorem Vert.x. Proto můžete efektivně odesílat, přijímat a zpracovávat zprávy ze systémů typu messaging middleware.

Na webu Quarkus.io bylo shromážděno několik dobrých návodů, které vám pomohou začít pracovat s Quarkus:

Kromě toho jsme připravili online praktické lekce pro seznámení se s různými aspekty reaktivního programování, přičemž k jejich absolvování potřebujete pouze prohlížeč, žádná IDE není nutná a počítač není povinný. Tyto lekce najdete zde.

Užitečné zdroje

10 video lekcí o Quarkus, abyste se seznámili s tématem

Jak píší na webu Quarkus.io, Quarkus – je Kubernetes-orientovaný Java stack určený pro GraalVM a OpenJDK HotSpot, složený z nejlepších Java knihoven a standardů.

Abychom vám pomohli se v tématu zorientovat, vybrali jsme 10 video lekcí, které pokrývají různé aspekty Quarkus a jeho použití:

1. Představujeme Quarkus: Java framework nové generace pro Kubernetes

Autoři: Thomas Qvarnstrom a Jason Greene
Cílem projektu Quarkus je vytvořit Java platformu pro Kubernetes a serverless prostředí, stejně jako spojit reaktivní a imperativní modely programování v rámci jednotného běhového prostředí, aby si vývojáři mohli flexibilně vybírat přístupy při práci se širokým spektrem distribuovaných architektur aplikací. Více se dozvíte z úvodní přednášky níže.

Přehrát video

2. Quarkus: superrychlá subatomární Java

Autor: Burr Sutter
Video lekce z internetové přednášky DevNation Live demonstruje, jak používat Quarkus k optimalizaci podnikových Java aplikací, API, mikroslužeb a serverless funkcí v prostředí Kubernetes/OpenShift, aby byly mnohem menší, rychlejší a škálovatelnější.

Přehrát video

3. Quarkus a GraalVM: zrychlení Hibernate na super rychlosti a zmenšení na subatomární velikosti

Autor: Sanne Grinovero
Z prezentace se dozvíte, jak vznikl Quarkus, jak funguje a jak umožňuje, aby komplexní knihovny, jako Hibernate ORM, byly kompatibilní s native obrazy GraalVM.

Přehrát video

4. Učíme se vyvíjet serverless aplikace

Autor: Marthen Luther
Ve videu níže je ukázáno, jak vytvořit jednoduchou Java aplikaci pomocí Quarkus a nasadit ji jako serverless aplikaci na Knative.

Přehrát video

5. Quarkus: kódujte s potěšením

Autor: Edson Yanaga
Videoguide k vytvoření vašeho prvního projektu Quarkus, který ukazuje, proč si Quarkus získává srdce vývojářů.

Přehrát video

6. Java a kontejnery – jaká bude jejich společná budoucnost

Autor: Mark Little
Tato prezentace seznamuje s historií Javy a vysvětluje, proč je Quarkus budoucností Javy.

Přehrát video

7. Quarkus: ultrarychlá subatomová Java

Autor: Dimitris Andreadis
Přehled výhod Quarkus, kterými si získal uznání vývojářů: jednoduchost, extrémní rychlost, nejlepší knihovny a standardy.

Přehrát video

8. Quarkus a subatomové reaktivní systémy

Autor: Clément Escoffier
Díky integraci s GraalVM poskytuje Quarkus ultrarychlé vývojové zkušenosti a subatomové prostředí pro spuštění. Autor hovoří o reaktivní stránce Quarkus a o tom, jak ji využít při vytváření reaktivních aplikací a aplikací pro streamování dat.

Přehrát video

9. Quarkus a rychlý vývoj aplikací v Eclipse MicroProfile

Autor: John Clingan
Spojením Eclipse MicroProfile a Quarkus mohou vývojáři vytvářet plně funkční kontejnerové aplikace MicroProfile, které se spouštějí během několika desetin sekund. Video podrobně popisuje, jak kódovat kontejnerovou aplikaci MicroProfile pro nasazení na platformě Kubernetes.

Přehrát video

10. Java, verze „Turbo“

Autor: Marcus Biel
Autor ukazuje, jak použít Quarkus k vytváření supermalých a superrychlých Java kontejnerů, které umožňují skutečný průlom, zejména v serverless prostředích.

Přehrát video


Zdroj: habr.com
Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster