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

V letošním roce plánujeme vážně rozvíjet témata kontejnerů, Cloudová nativní Java и Kubernetes. Logickým pokračováním těchto témat bude již příběh o frameworku Quarkus považováno na Habré. Dnešní článek je méně o návrhu „subatomární superfast Java“ a více o příslibu, který Quarkus přináší Enterprise.

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

Java a JVM jsou stále extrémně populární, ale při práci s bezserverovými technologiemi a cloudovými nativními mikroslužbami se Java a další jazyky JVM používají stále méně, protože zabírají příliš mnoho místa v paměti a načítají se příliš pomalu, takže špatně se hodí pro použití s ​​nádobami s krátkou životností. Naštěstí se tato situace nyní začíná měnit díky Quarkusu.

Superrychlá subatomární Java dosáhla nové úrovně!

42 vydání, 8 měsíců komunitní práce 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ý milník ve vývoji projektu a nabízí spoustu skvělých funkcí a schopností (více o nich si můžete přečíst v oznámení).

Dnes vám ukážeme, jak Quarkus kombinuje imperativní a reaktivní programovací modely do jediného reaktivního jádra. Začneme stručnou historií a pak půjdeme do detailů o tom, co je Quarkusův reaktivní dualismus jádra a jak Jáva-Vývojáři mohou využít těchto výhod.

Mikroslužby, architektury řízené událostmi и serverless-funkce – to vše je dnes, jak se říká, na vzestupu. V poslední době je vytváření cloud-centric architektur mnohem jednodušší a dostupnější, ale problémy přetrvávají – zejména pro vývojáře v Javě. Například v případě bezserverových funkcí a mikroslužeb existuje naléhavá potřeba zkrátit dobu spouštění, snížit spotřebu paměti a přesto učinit jejich vývoj pohodlnějším a zábavnějším. Java v posledních letech provedla několik vylepšení, jako je vylepšená ergonomie pro kontejnery a tak dále. Přimět Java ke správnému fungování v kontejneru je však stále náročné. Začneme tedy tím, že se podíváme na některé přirozené složitosti Javy, které jsou zvláště akutní při vývoji kontejnerově orientovaných Java aplikací.

Nejprve se podívejme do historie.

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

Potoky a kontejnery

Počínaje verzí 8u131 začala Java víceméně podporovat kontejnery kvůli vylepšení funkčnosti ergonomie. JVM nyní zejména ví, na kolika procesorových jádrech běží, a může podle toho konfigurovat fondy vláken – obvykle fondy fork/join. To je samozřejmě skvělé, ale řekněme, že máme tradiční webovou aplikaci, která používá HTTP servlety a běží v Tomcat, Jetty atd. Výsledkem je, že tato aplikace přidělí každému požadavku samostatné vlákno a umožní mu blokovat toto vlákno při čekání na I/O operace, například při přístupu k databázi, souborům nebo jiným službám. To znamená, že velikost takové aplikace nezávisí na počtu dostupných jader, ale na počtu souběžných požadavků. Navíc to znamená, že kvóty nebo limity v Kubernetes na počet jader zde příliš nepomohou a věc nakonec skončí throttlingem.

Vyčerpání paměti

Vlákna jsou paměť. A omezení paměti uvnitř kontejneru nejsou v žádném případě všelékem. Stačí začít zvyšovat počet aplikací a vláken a dříve nebo později narazíte na kritické zvýšení frekvence přepínání a v důsledku toho na snížení výkonu. Pokud vaše aplikace používá tradiční rámce mikroslužeb nebo se připojuje k databázi nebo používá ukládání do mezipaměti nebo jinak spotřebovává paměť, samozřejmě potřebujete nástroj, který vám umožní nahlédnout do JVM a zjistit, jak spravuje paměť, aniž by ji zabil. Samotný JVM (například XX:+UseCGroupMemoryLimitForHeap). A i když se od Java 9 JVM naučilo přijímat cgroups a podle toho se přizpůsobovat, zůstává rezervace a správa paměti poměrně složitou záležitostí.

Kvóty a limity

Java 11 zavedla podporu pro kvóty CPU (jako PreferContainerQuotaForCPUCount). Kubernetes také nabízí podporu limitů a kvót. Ano, toto vše dává smysl, ale pokud aplikace opět překročí přidělenou kvótu, opět skončíme s velikostí – jako je tomu u tradičních Java aplikací – určenou počtem jader a s přidělením samostatného vlákna pro každé žádost, pak to všechno nemá smysl.
Kromě toho, pokud používáte kvóty a limity nebo funkce scale-out platformy, která je základem Kubernetes, problém se také nevyřeší. Jednoduše vynaložíme více prostředků na řešení původního problému nebo skončíme utrácením nadměrně. A pokud se jedná o vysoce vytížený systém ve veřejném veřejném cloudu, téměř jistě nakonec spotřebujeme více zdrojů, než skutečně potřebujeme.

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

Jednoduše řečeno, používejte asynchronní a neblokující I/O knihovny a frameworky jako Netty, Vert.x nebo Akka. Díky své reaktivní povaze se mnohem lépe hodí pro práci v kontejnerech. Díky neblokujícím I/O může stejné vlákno zpracovávat více požadavků současně. Zatímco jeden požadavek čeká na výsledky I/O, vlákno zpracovávající jej uvolní a převezme jiný požadavek. A když výsledky I/O konečně dorazí, zpracování prvního požadavku pokračuje. Prokládaným zpracováním požadavků v rámci stejného vlákna můžete snížit celkový počet vláken a snížit spotřebu prostředků na zpracování požadavků.

U neblokujících I/O se počet jader stává klíčovým parametrem, protože určuje počet I/O vláken, která lze provádět paralelně. Při správném použití to umožňuje efektivně rozložit zátěž mezi jádra a zvládnout vyšší zátěž s menším počtem zdrojů.

Jak, to je všechno?

Ne, je tu něco jiného. Reaktivní programování pomáhá lépe využívat zdroje, ale také něco stojí. Zejména kód bude muset být přepsán podle zásad neblokování a vyhnout se blokování I/O vláken. A to je úplně jiný model vývoje a provedení. A ačkoliv je zde spousta užitečných knihoven, stále jde o radikální změnu obvyklého způsobu myšlení.

Nejprve se musíte naučit psát kód, který běží asynchronně. Jakmile začnete používat neblokující I/O, musíte explicitně určit, co se má stát, když je přijata odpověď na požadavek. Pouhé zablokování a čekání již nebude fungovat. Místo toho můžete předat zpětná volání, použít reaktivní programování nebo pokračování. Ale to není vše: k použití neblokujících I/O potřebujete jak neblokující servery, tak klienty, nejlépe všude. V případě HTTP je vše jednoduché, ale existují také databáze, souborové systémy a mnoho dalšího.

A ačkoli celková reaktivita mezi koncovými body maximalizuje účinnost, takový posun může být v praxi obtížné přijmout. Schopnost kombinovat reaktivní a imperativní kód se proto stává nezbytným předpokladem pro:

  1. Efektivně využívat zdroje v nejvíce zatížených oblastech softwarového systému;
  2. V jeho zbývajících částech použijte jednodušší kód stylu.

Představujeme Quarkus

Ve skutečnosti je to podstata Quarkusu - kombinovat reaktivní a imperativní modely v rámci jediného běhového prostředí.

Quarkus je založen na Vert.x a Netty s řadou reaktivních rámců a rozšíření, které pomáhají vývojářům. Quarkus je navržen pro vytváření nejen HTTP mikroslužeb, ale také architektur řízených událostmi. Díky své reaktivní povaze velmi efektivně spolupracuje se systémy zasílání zpráv (Apache Kafka, AMQP atd.).

Trik je v tom, jak použít stejný reaktivní engine pro imperativní i reaktivní kód.

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

Quarkus to umí skvěle. Volba mezi imperativním a reaktivním je zřejmá – pro obojí použijte reaktivní jádro. S čím to opravdu pomáhá, je rychlý, neblokující kód, který zvládne téměř vše, co prochází vláknem smyčky událostí, neboli IO vláknem. Ale pokud máte klasické REST nebo klientské aplikace, Quarkus má imperativní programovací model připraven. Například podpora HTTP v Quarkusu je založena na použití neblokujícího a reaktivního enginu (Eclipse Vert.x a Netty). Všechny požadavky HTTP přijaté vaší aplikací jsou nejprve předány smyčkou událostí (IO Thread) a poté odeslány do části kódu, která spravuje požadavky. V závislosti na cíli lze kód správy požadavků volat v rámci samostatného vlákna (tzv. pracovní vlákno, používané v případě servletů a Jax-RS) nebo použít zdrojové I/O vlákno (reaktivní cesta).

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

Konektory systému zasílání zpráv používají neblokující klienty spuštěné nad modulem Vert.x. Proto můžete efektivně odesílat, přijímat a zpracovávat zprávy ze systémů middlewaru pro zasílání zpráv.

Tato stránka Quarkus.io Zde je několik dobrých návodů, které vám pomohou začít s Quarkusem:

Vytvořili jsme také online praktické výukové programy, které vás naučí různé aspekty reaktivního programování pouze v prohlížeči, bez IDE a bez počítače. Tyto lekce najdete zde.

Užitečné zdroje

10 videolekcí o Quarkusu, abyste se seznámili s tématem

Jak říkají na webu Quarkus.io, kvarkus - je Kubernetes- orientovaný Java stack, přizpůsobený pro GraalVM a OpenJDK HotSpot a sestavený z nejlepších Java knihoven a standardů.

Abychom vám pomohli porozumět tématu, vybrali jsme 10 video tutoriálů, které pokrývají různé aspekty Quarkusu a příklady jeho použití:

1. Představujeme Quarkus: Nová generace Java Framework pro Kubernetes

Autor Thomas Qvarnstrom a Jason Greene
Cílem projektu Quarkus je vytvořit platformu Java pro prostředí Kubernetes a bezserverová prostředí a zkombinovat reaktivní a imperativní programovací modely do jediného runtime prostředí, aby vývojáři mohli flexibilně měnit svůj přístup při práci s širokou škálou architektur distribuovaných aplikací. Více se dozvíte v úvodní přednášce níže.

2. Quarkus: Superfast subatomic Java

Autor: Burr Sutter
Toto video tutoriál z DevNation Live ukazuje, jak používat Quarkus k optimalizaci podnikových Java aplikací, rozhraní API, mikroslužeb a bezserverových funkcí v prostředí Kubernetes/OpenShift, díky čemuž jsou mnohem menší, rychlejší a škálovatelnější.

3. Quarkus a GraalVM: zrychlení hibernace na superrychlost a její zmenšení na subatomární velikosti

Autor: Sanne Grinovero
Z prezentace se dozvíte, jak Quarkus vznikl, jak funguje a jak vám umožňuje vytvářet složité knihovny, jako je Hibernate ORM, kompatibilní s nativními obrazy GraalVM.

4. Naučte se vyvíjet aplikace bez serveru

Autor: Martin Luther
Video níže ukazuje, jak vytvořit jednoduchou Java aplikaci pomocí Quarkus a nasadit ji jako bezserverovou aplikaci na Knative.

5. Quarkus: Bavte se kódováním

Autor: Edson Yanaga
Video průvodce vytvořením vašeho prvního projektu Quarkus, který vám umožní pochopit, proč si Quarkus získává srdce vývojářů.

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

Zveřejnil to Mark Little
Tato prezentace představuje historii Javy a vysvětluje, proč je Quarkus budoucností Javy.

7. Quarkus: Superfast subatomic Java

Autor: Dimitris Andreadis
Přehled výhod Quarkusu, které získaly uznání od vývojářů: jednoduchost, ultra vysoké rychlosti, nejlepší knihovny a standardy.

8. Kvarkusové a subatomární raketové systémy

Autor: Clement Escoffier
Díky integraci s GraalVM poskytuje Quarkus ultra rychlý vývoj a subatomární runtime prostředí. Autor hovoří o reaktivní stránce Quarkusu a o tom, jak ji použít k vytváření reaktivních a streamovacích aplikací.

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

Autor: John Clingan
Kombinací Eclipse MicroProfile a Quarkus mohou vývojáři vytvářet plnohodnotné kontejnerové aplikace MicroProfile, které se spouštějí během desítek milisekund. Video podrobně popisuje, jak nakódovat kontejnerizovanou aplikaci MicroProfile pro nasazení na platformě Kubernetes.

10. Java, verze "Turbo".

Autor: Marcus Biel
Autor ukazuje, jak použít Quarkus k vytvoření super malých, super rychlých Java kontejnerů, které umožňují skutečné průlomy, zejména v prostředích bez serveru.



Zdroj: www.habr.com

Přidat komentář