Ako Quarkus spája imperatívne a reaktívne programovanie

V tomto roku plánujeme vážne rozvíjať témy kontajnerov, Cloud-Native Java a Kubernetes. Logickým pokračovaním týchto tém bude rozprávanie o frameworku Quarkus, už preskúmanom na Habr. Dnešný článok nie je venovaný len fungovaniu "subatomárnej superrýchlej Javy", ale aj perspektívam, ktoré Quarkus prináša do podnikového prostredia.

Ako Quarkus spája imperatívne a reaktívne programovanie

Java a JVM sú stále výnimočne populárne, no pri práci s bezserverovými technológiami a cloudovo orientovanými mikroservismi sa Java a iné jazyky pre JVM využívajú čoraz menej, pretože zaberajú príliš veľa miesta v pamäti a pomaly sa načítavajú, čo zhoršuje ich vhodnosť na použitie s krátkodobými kontajnermi. Našťastie sa teraz situácia začína meniť vďaka Quarkus.

Superrýchla subatomárna Java dosiahla novú úroveň!

42 vydaní, 8 mesiacov práce komunity a 177 úžasných vývojárov – výsledkom toho všetkého bolo vydanie v novembri 2019 Quarkus 1.0, vydanie, ktoré označuje dôležitý míľnik v rozvoji projektu a ponúka množstvo skvelých funkcií a možností (viac o nich sa môžete dočítať v oznámení).

Dnes vám ukážeme, ako Quarkus spája modely imperatívneho a reaktívneho programovania na základe jedného reaktívneho jadra. Začneme stručným výletom do histórie, a potom podrobne preskúmame, v čom spočíva dualizmus reaktívneho jadra Quarkus a ako Java-vývojári môžu využiť tieto výhody.

Mikroservisy, architektúry riadené udalosťami a serverless-funkcie – to všetko je dnes, ako sa hovorí, na vzostupe. V poslednej dobe sa vytváranie cloudovo orientovaných architektúr stalo oveľa jednoduchším a dostupnejším, avšak problémy pretrvávajú – najmä u Java vývojárov. Napríklad v prípade serverless funkcií a mikroservisov existuje naliehavá potreba skrátiť čas spustenia, znížiť spotrebu pamäte a spraviť ich vývoj pohodlnejším a príjemnejším. Java v posledných rokoch priniesla niekoľko vylepšení, ako napríklad upravenú ergonomiku pre kontajnery a podobne. Napriek tomu nie je dosiahnutie normálnej funkčnosti Java v kontajneri stále jednoduché. Preto začneme tým, že preskúmame niektoré vnútorné zložitosti Javy, ktoré sa najviac prejavujú pri vývoji kontajnerovo orientovaných Java aplikácií.

Začnime s históriou.

Ako Quarkus spája imperatívne a reaktívne programovanie

Prúdy a kontajnery

Od verzie 8u131 začala Java viac-menej podporovať kontajnery prostredníctvom vylepšení v oblasti ergonómie. Konkrétne teraz JVM vie, na koľkých procesorových jadrách beží, a môže zodpovedajúcim spôsobom nastavovať pooly prúdov – zvyčajne pooly fork/join. Samozrejme, to je skvelé, ale predpokladajme, že máme tradičnú webovú aplikáciu využívajúcu HTTP servlety, spúšťanú v Tomcat, Jetty a podobne. V dôsledku toho táto aplikácia priradí každý požiadavok k samostatnému prúdu a umožní mu zablokovať tento prúd počas čakania na operácie vstupu/výstupu, napríklad pri prístupe k databáze, súborom alebo iným službám. To znamená, že veľkosť takejto aplikácie nezávisí od počtu dostupných jadier, ale od počtu súčasných požiadaviek. Okrem toho to znamená, že kvóty alebo limity v Kubernetes na počet jadier tu veľmi nepomôžu a nakoniec sa to skončí throttlingom.

Vyčerpanie pamäte

Prúdy sú pamäť. A vnútrokontajnerové obmedzenia na pamäť nie sú zďaleka všeliek. Stačí začať zvyšovať počet aplikácií a prúdov a skôr či neskôr sa stretnete s kritickým nárastom frekvencie prepínania a následne so zhoršením výkonu. Okrem toho, ak aplikácia používa tradičné rámce mikroservisov alebo je pripojená k databáze, alebo využíva cachovanie, alebo nejakým spôsobom ďalej spotrebúva pamäť, určite potrebujete nástroj, ktorý vám umožní nahliadnuť do JVM a zistiť, ako spravuje pamäť, a pritom nezabiť samotnú JVM (napríklad XX:+UseCGroupMemoryLimitForHeap). A aj keď sa od Java 9 JVM naučila vnímať cgroups a prispôsobovať sa im, rezervácia a správa pamäte zostáva pomerne zložitou záležitosťou.

Kvóty a limity

V Java 11 bola zavedená podpora CPU kvót (ako PreferContainerQuotaForCPUCount). Kubernetes tiež ponúka podporu limitov a kvót. Áno, všetko to dáva zmysel, ale ak aplikácia opäť prekročí pridelenú kvótu, vraciame sa k tomu, že veľkosť – ako v prípade tradičných Java aplikácií – sa určuje podľa počtu jadier s priradením samostatného prúdu na každý požiadavok, takže z tohto všetkého nie je veľký úžitok.
Navyše, ak použijeme kvóty a limity alebo funkcie horizontálneho (scale-out) škálovania platformy, na ktorej je postavený Kubernetes, problém sa sám nevyrieši. Jednoducho míňame viac zdrojov na riešenie pôvodného problému alebo nakoniec prichádzame k nadmernému využívaniu zdrojov. A ak ide o vysoko zaťažený systém v verejnom cloude, takmer určite začíname využívať viac zdrojov, než je naozaj potrebné.

A čo s tým všetkým robiť?

Ak to zjednodušíme, treba použiť asynchrónne a neblokujúce knižnice vstupu/výstupu a frameworky ako Netty, Vert.x alebo Akka. Sú oveľa lepšie prispôsobené na prácu v kontajneroch kvôli svojej reaktívnej povahe. Vďaka neblokujúcemu vstupu/výstupu môže ten istý vláknový spracovávač spracovať viacero súbežných požiadaviek. Kým jedna požiadavka čaká na výsledky vstupu/výstupu, spracovávajúce vlákno sa oslobodí a prejde k inej požiadavke. A keď nakoniec prichádzajú výsledky vstupu/výstupu, spracovanie prvej požiadavky pokračuje. Striedaním spracovania požiadaviek v rámci toho istého vlákna môžeme znížiť celkový počet vlákien a zredukovať spotrebu zdrojov na spracovanie požiadaviek.

Pri neblokujúcom vstupe/výstupe sa počet jadier stáva kľúčovým parametrom, pretože určuje počet vstupno-výstupných vlákien, ktoré môžu bežať súbežne. Pri správnom použití umožňuje efektívne rozložiť záťaž medzi jadrá a zvládať vyššie zaťaženia s menšími zdrojmi.

Ako, a to je všetko?

Nie, je tu ešte niečo. Reaktívne programovanie pomáha lepšie využívať zdroje, ale tiež má svoju cenu. Konkrétne bude potrebné prepisovať kód podľa princípov neblokovania a vyhýbať sa blokovaniu vstupno-výstupných vlákien. A to je úplne iný model vývoja a vykonávania. A hoci tu existuje množstvo užitočných knižníc, stále ide o radikálnu zmenu v bežnom spôsobe myslenia.

Po prvé, musíte sa naučiť písať kód, ktorý sa vykonáva asynchrónne. Akonáhle začnete používať neblokujúci vstup/výstup, musíte jasne uviesť, čo sa má stať pri prijatí odpovede na požiadavku. Už nemôžete len tak blokovať a čakať. Namiesto toho môžete prenášať spätné volania, používať reaktívne programovanie alebo continuations. Ale to nie je všetko: na použitie neblokujúceho vstupu/výstupu potrebujete aj neblokujúce servery a klientov, a ideálne všade. V prípade HTTP je to jednoduché, ale sú tu aj databázy, súborové systémy a mnohé iné.

A aj keď totálna priečna reaktivita poskytuje maximálnu efektivitu, takýto posun môže byť ťažko stráviteľný v praxi. Preto je potrebné mať možnosť kombinovať reaktívny a imperatívny kód.

  1. Efektívne využívať zdroje v najvyťaženejších oblastiach softvérneho systému;
  2. Používať jednoduchší kód v ostatných častiach.

Predstavujeme Quarkus

O to ide v Quarkus – spojiť reaktívne a imperatívne modely v rámci jednej vykonávacej platformy.

Quarkus stojí na vert.x a Netty, na ktorých je použitých množstvo reaktívnych frameworkov a rozšírení, určené na pomoc vývojárom. Quarkus je navrhnutý na budovanie nielen HTTP mikroslužieb, ale aj architektúr riadených udalosťami. Vďaka svojej reaktívnej povahe je veľmi efektívny pri práci so systémami správy správ (Apache Kafka, AMQP a pod.).

Celá pointa je, ako využiť rovnaký reaktívny engine pre imperatívny aj reaktívny kód.

Ako Quarkus spája imperatívne a reaktívne programovanie

Quarkus s týmto skvele nakladá. Voľba medzi imperatívnym a reakčným prístupom je zrejmá – použiť reakčné jadro pre obidva. A veľmi pomáha pri rýchlom neblokujúcom kóde, ktorý spracúva takmer všetko, čo prechádza cez cyklus udalostí (event-loop thread, teda IO thread). Ak však máte klasické aplikácie REST alebo klientské aplikácie, Quarkus má pripravený imperatívny model programovania. Napríklad podpora HTTP v Quarkus je založená na použití neblokujúceho a reakčného enginu (Eclipse Vert.x a Netty). Všetky HTTP požiadavky prijímané vaša aplikácia najskôr prechádzajú cez cyklus udalostí (IO Thread), a potom sú odosielané tej časti kódu, ktorá spravuje požiadavky. V závislosti od cieľa môže byť riadiaci kód spustený v rámci samostatného vlákna (tzv. worker thread, ktorý sa používa v prípade servletov a Jax-RS) alebo môže využívať pôvodné vstupno-výstupné vlákno (reakčný smer reactive route).

Ako Quarkus spája imperatívne a reaktívne programovanie

Pre konektory systémov prenosu správ sa používajú neblokujúce klienty fungujúce na motore Vert.x. Môžete tak efektívne posielať, prijímať a spracovávať správy zo systémov typu messaging middleware.

Na stránke Quarkus.io zhromaždilo niekoľko dobrých príručiek, ktoré vám pomôžu začať s Quarkus:

Okrem toho sme pripravili online praktické lekcie, ktoré vás oboznámia s rôznymi aspektmi reakčného programovania, pričom na ich absolvovanie stačí len prehliadač, nie je potrebná žiadna IDE a ani počítač nie je nevyhnutný. Tieto lekcie nájdete tu.

Užitočné zdroje

10 video lekcií o Quarkus, aby ste sa dostali do témy

Ako sa uvádza na stránke Quarkus.io, Quarkus logický kanál Kubernetes-orientovaný Java stack, zameraný na GraalVM a OpenJDK HotSpot, zostavený z najlepších Java knižníc a štandardov.

Aby sme vám pomohli objasniť tému, vybrali sme 10 video lekcií, ktoré pokrývajú rôzne aspekty Quarkus a príklady jeho použitia:

1. Predstavujeme Quarkus: Java framework novej generácie pre Kubernetes

Autori: Thomas Qvarnstrom a Jason Greene
Cieľom projektu Quarkus je vytvoriť Java platformu pre Kubernetes a serverless prostredia a zároveň spojiť reaktívne a imperatívne modely programovania v rámci jedného vykonávacieho prostredia, aby si vývojári mohli flexibilne prispôsobiť prístup pri práci so širokým spektrom distribuovaných architektúr aplikácií. Viac informácií nájdete v nasledujúcej úvodnej prednáške.

Prehrajte video

2. Quarkus: superrýchla subatomárna Java

Autor: Burr Sutter
Videonávod z internetového lektora DevNation Live demonštruje, ako používať Quarkus na optimalizáciu podnikových Java aplikácií, API, mikroservisov a serverless funkcií v prostredí Kubernetes/OpenShift, čím sa stávajú oveľa menšími, rýchlejšími a škálovateľnejšími.

Prehrajte video

3. Quarkus a GraalVM: zrýchlenie Hibernate na superrýchlosti a zmenšenie do subatomárnych rozmerov

Autor: Sanne Grinovero
Z prezentácie sa dozviete, ako Quarkus vznikol, ako funguje a ako umožňuje sprístupniť komplexné knižnice, ako Hibernate ORM, pre native obrazy GraalVM.

Prehrajte video

4. Učíme sa vyvíjať serverless aplikácie

Autor: Marthen Luther
V nasledujúcom videu sa dozviete, ako vytvoriť jednoduchú Java aplikáciu pomocou Quarkus a nasadiť ju ako serverless aplikáciu na Knative.

Prehrajte video

5. Quarkus: programujte s radosťou

Autor: Edson Yanaga
Videonávod na vytvorenie vášho prvého projektu Quarkus, ktorý vám pomôže pochopiť, prečo si Quarkus získava srdcia vývojárov.

Prehrajte video

6. Java a kontajneri – aká bude ich spoločná budúcnosť

Autor: Mark Little
Táto prezentácia vás oboznamuje s históriou Javy a vysvetľuje, prečo je Quarkus budúcnosťou Javy.

Prehrajte video

7. Quarkus: superrýchla subatomárna Java

Autor: Dimitris Andreadis
Prehľad výhod Quarkus, ktoré si získali uznanie vývojárov: jednoduchosť, super vysoké rýchlosti, najlepšie knižnice a štandardy.

Prehrajte video

8. Quarkus a subatomárne reaktívne systémy

Autor: Clement Escoffier
Vďaka integrácii s GraalVM Quarkus poskytuje superrýchly zážitok z vývoja a subatomárne vykonávacie prostredie. Autor hovorí o reaktívnej stránke Quarkus a o tom, ako ju využiť pri vytváraní reaktívnych aplikácií a aplikácií s prenosom dát.

Prehrajte video

9. Quarkus a rýchly vývoj aplikácií v Eclipse MicroProfile

Autor: John Clingan
Kombinovaním Eclipse MicroProfile a Quarkus môžu vývojári vytvárať plne funkčné kontajnerové aplikácie MicroProfile, ktoré sa spúšťajú za niekoľko desiatok milisekúnd. V video prezentácii sa podrobne rozoberá, ako kódovať kontajnerovú aplikáciu MicroProfile na nasadenie na platforme Kubernetes.

Prehrajte video

10. Java, verzia „Turbo“

Autor: Markus Biel
Autor ukazuje, ako použiť Quarkus na vytváranie supermalých a superrýchlych Java kontajnerov, ktoré umožňujú skutočný pokrok, najmä v prostrediach serverless.

Prehrajte video


Zdroj: habr.com
Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster