Ako Quarkus kombinuje imperatívne a reaktívne programovanie

Tento rok plánujeme vážne rozvíjať témy kontajnerov, Cloudová natívna Java и Kubernetes. Logickým pokračovaním týchto tém bude už príbeh o frameworku Quarkus zvážiť na Habré. Dnešný článok je menej o dizajne „subatomárnej superrýchlej Java“ a viac o prísľube, ktorý Quarkus prináša Enterprise.

Ako Quarkus kombinuje imperatívne a reaktívne programovanie

Java a JVM sú stále veľmi populárne, ale pri práci s bezserverovými technológiami a natívnymi cloudovými mikroslužbami sa Java a ďalšie jazyky JVM používajú čoraz menej, pretože zaberajú príliš veľa miesta v pamäti a príliš pomaly sa načítavajú, takže málo vhodný na použitie s nádobami s krátkou životnosťou. Našťastie sa táto situácia teraz začína meniť vďaka Quarkusovi.

Superrýchla subatomická Java dosiahla novú úroveň!

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

Dnes vám ukážeme, ako Quarkus kombinuje imperatívne a reaktívne programovacie modely do jedného reaktívneho jadra. Začneme krátkou históriou a potom prejdeme do detailov o tom, čo je Quarkusov reaktívny dualizmus jadra a ako Jáva-Vývojári môžu využiť tieto výhody.

Mikroslužby, architektúry riadené udalosťami и bez servera-funkcie – to všetko je dnes, ako sa hovorí, na vzostupe. V poslednej dobe je vytváranie cloud-centric architektúr oveľa jednoduchšie a dostupnejšie, no problémy pretrvávajú – najmä pre vývojárov Java. Napríklad v prípade bezserverových funkcií a mikroslužieb je naliehavá potreba skrátiť čas spustenia, znížiť spotrebu pamäte a napriek tomu urobiť ich vývoj pohodlnejším a príjemnejším. Java za posledné roky urobila niekoľko vylepšení, ako napríklad vylepšenú funkčnosť ergonómie kontajnerov a podobne. Zabezpečiť správne fungovanie Java v kontajneri je však stále náročné. Začneme teda pohľadom na niektoré základné zložitosti Java, ktoré sú obzvlášť akútne pri vývoji kontajnerovo orientovaných Java aplikácií.

Najprv sa pozrime do histórie.

Ako Quarkus kombinuje imperatívne a reaktívne programovanie

Potoky a kontajnery

Počnúc verziou 8u131 začala Java viac-menej podporovať kontajnery kvôli zlepšeniu funkčnosti ergonómie. Konkrétne, JVM teraz vie, na koľkých procesorových jadrách beží, a môže podľa toho konfigurovať oblasti vlákien – zvyčajne oblasti rozvetvenia/pripojenia. To je samozrejme skvelé, ale povedzme, že máme tradičnú webovú aplikáciu, ktorá používa HTTP servlety a beží v Tomcat, Jetty atď. Výsledkom je, že táto aplikácia pridelí každej požiadavke samostatné vlákno a umožní jej zablokovať toto vlákno počas čakania na I/O operácie, 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 simultánnych požiadaviek. Okrem toho to znamená, že kvóty alebo limity v Kubernetes na počet jadier tu veľmi nepomôžu a záležitosť sa nakoniec skončí škrtením.

Vyčerpanie pamäte

Vlákna sú pamäť. A obmedzenia pamäte vo vnútri kontajnera nie sú v žiadnom prípade všeliekom. Stačí začať zvyšovať počet aplikácií a vlákien a skôr či neskôr narazíte na kritické zvýšenie frekvencie prepínania a v dôsledku toho aj na zníženie výkonu. Ak vaša aplikácia používa tradičné rámce mikroslužieb alebo sa pripája k databáze, používa ukladanie do vyrovnávacej pamäte alebo inak využíva pamäť, samozrejme potrebujete nástroj, ktorý vám umožní nahliadnuť do JVM a zistiť, ako spravuje pamäť bez toho, aby ju zabil. Samotný JVM (napríklad XX:+UseCGroupMemoryLimitForHeap). A aj keď sa JVM od Java 9 naučilo akceptovať cgroups a podľa toho sa prispôsobiť, rezervovanie a správa pamäte zostáva pomerne zložitou záležitosťou.

Kvóty a limity

Java 11 zaviedla podporu pre kvóty CPU (ako PreferContainerQuotaForCPUCount). Kubernetes tiež ponúka podporu limitov a kvót. Áno, toto všetko dáva zmysel, ale ak aplikácia opäť prekročí pridelenú kvótu, opäť skončíme s veľkosťou – ako je to v prípade tradičných Java aplikácií – určenou počtom jadier a pridelením samostatného vlákna pre každé žiadosť, potom to všetko nemá zmysel.
Okrem toho, ak používate kvóty a limity alebo škálovacie funkcie základnej platformy Kubernetes, problém sa nevyrieši. Jednoducho míňame viac zdrojov na vyriešenie pôvodného problému alebo nakoniec míňame príliš veľa. A ak ide o vysoko zaťažený systém vo verejnom verejnom cloude, takmer určite nakoniec spotrebujeme viac zdrojov, ako skutočne potrebujeme.

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

Zjednodušene povedané, použite asynchrónne a neblokujúce I/O knižnice a rámce ako Netty, Vert.x alebo Akka. Vďaka svojej reaktívnej povahe sú oveľa vhodnejšie na prácu v kontajneroch. Vďaka neblokujúcim I/O dokáže to isté vlákno spracovať viacero požiadaviek súčasne. Kým jedna požiadavka čaká na I/O výsledky, vlákno, ktoré ju spracúva, sa uvoľní a prevezme iná požiadavka. A keď konečne prídu výsledky I/O, spracovanie prvej požiadavky pokračuje. Prekladaným spracovaním požiadaviek v rámci toho istého vlákna môžete znížiť celkový počet vlákien a znížiť spotrebu prostriedkov na spracovanie požiadaviek.

Pri neblokujúcich I/O sa počet jadier stáva kľúčovým parametrom, pretože určuje počet I/O vlákien, ktoré je možné vykonávať paralelne. Pri správnom použití vám to umožňuje efektívne rozložiť záťaž medzi jadrá a zvládnuť vyššie pracovné zaťaženie s menším počtom zdrojov.

Ako, to je všetko?

Nie, je tu niečo iné. Reaktívne programovanie pomáha lepšie využívať zdroje, ale má aj svoju cenu. Najmä kód bude musieť byť prepísaný podľa zásad neblokovania a vyhnúť sa blokovaniu I/O vlákien. A to je úplne iný model vývoja a realizácie. A hoci je tu množstvo užitočných knižníc, stále ide o radikálnu zmenu zaužívaného spôsobu myslenia.

Najprv sa musíte naučiť písať kód, ktorý beží asynchrónne. Keď začnete používať neblokujúce I/O, musíte explicitne špecifikovať, čo sa má stať, keď je prijatá odpoveď na požiadavku. Jednoduché blokovanie a čakanie už nebude fungovať. Namiesto toho môžete odovzdať spätné volania, použiť reaktívne programovanie alebo pokračovanie. Ale to nie je všetko: na používanie neblokujúcich I/O potrebujete neblokujúce servery aj klientov, najlepšie všade. V prípade HTTP je všetko jednoduché, no existujú aj databázy, súborové systémy a mnoho ďalšieho.

A hoci celková reaktivita medzi koncovými bodmi maximalizuje účinnosť, takýto posun môže byť v praxi ťažko zvládnuteľný. Preto sa schopnosť kombinovať reaktívny a imperatívny kód stáva nevyhnutným predpokladom, aby:

  1. Efektívne využívať zdroje v najviac zaťažených oblastiach softvérového systému;
  2. Vo zvyšných častiach použite jednoduchší kód štýlu.

Predstavujeme Quarkus

V skutočnosti je to podstata Quarkusu - kombinovať reaktívne a imperatívne modely v rámci jedného runtime prostredia.

Quarkus je založený na Vert.x a Netty s radom reaktívnych rámcov a rozšírení, ktoré pomáhajú vývojárom. Quarkus je určený na budovanie nielen HTTP mikroslužieb, ale aj architektúr riadených udalosťami. Vďaka svojej reaktívnej povahe veľmi efektívne spolupracuje so systémami zasielania správ (Apache Kafka, AMQP atď.).

Trik je v tom, ako použiť rovnaký reaktívny motor pre imperatívny aj reaktívny kód.

Ako Quarkus kombinuje imperatívne a reaktívne programovanie

Quarkus to robí bravúrne. Voľba medzi imperatívom a reaktívnym je zrejmá - použite reaktívne jadro pre obe. S čím naozaj pomáha, je rýchly, neblokujúci kód, ktorý zvládne takmer všetko, čo prechádza vláknom slučky udalostí, alias vláknom IO. Ale ak máte klasické REST alebo aplikácie na strane klienta, Quarkus má pripravený imperatívny programovací model. Napríklad podpora HTTP v Quarkus je založená na použití neblokovacieho a reaktívneho enginu (Eclipse Vert.x a Netty). Všetky požiadavky HTTP prijaté vašou aplikáciou najskôr prejdú slučkou udalostí (IO vlákno) a potom sa odošlú do časti kódu, ktorá spravuje požiadavky. V závislosti od miesta určenia je možné volať kód správy požiadaviek v rámci samostatného vlákna (tzv. pracovné vlákno, používané v prípade servletov a Jax-RS) alebo použiť zdrojové I/O vlákno (reaktívne smerovanie).

Ako Quarkus kombinuje imperatívne a reaktívne programovanie

Konektory systému zasielania správ používajú neblokujúcich klientov, ktorí bežia nad jadrom Vert.x. Preto môžete efektívne odosielať, prijímať a spracovávať správy zo systémov middleware na odosielanie správ.

Táto stránka Quarkus.io Tu je niekoľko dobrých tutoriálov, ktoré vám pomôžu začať s Quarkusom:

Vytvorili sme tiež online praktické návody, ktoré vás naučia rôzne aspekty reaktívneho programovania len v prehliadači, bez IDE a bez počítača. Tieto lekcie nájdete tu.

Užitočné zdroje

10 video lekcií o Quarkus, aby ste sa oboznámili s témou

Ako hovoria na webe Quarkus.io, kvarkus - Je Kubernetes-orientovaný Java stack, prispôsobený pre GraalVM a OpenJDK HotSpot a zostavený z najlepších Java knižníc a štandardov.

Aby sme vám pomohli porozumieť téme, vybrali sme 10 video tutoriálov, ktoré pokrývajú rôzne aspekty Quarkusu a príklady jeho použitia:

1. Predstavujeme Quarkus: Nová generácia Java Framework pre Kubernetes

Autormi sú Thomas Qvarnstrom a Jason Greene
Cieľom projektu Quarkus je vytvoriť platformu Java pre Kubernetes a bezserverové prostredia a spojiť reaktívne a imperatívne programovacie modely do jedného runtime prostredia, aby vývojári mohli flexibilne meniť svoj prístup pri práci so širokou škálou distribuovaných aplikačných architektúr. Viac sa dozviete v úvodnej prednáške nižšie.

2. Quarkus: Superfast Subatomic Java

Autor: Burr Sutter
Tento video tutoriál od DevNation Live ukazuje, ako používať Quarkus na optimalizáciu podnikových Java aplikácií, API, mikroslužieb a bezserverových funkcií v prostredí Kubernetes/OpenShift, vďaka čomu sú oveľa menšie, rýchlejšie a škálovateľnejšie.

3. Quarkus a GraalVM: zrýchlenie hibernácie na super rýchlosti a jej zmenšenie na subatomárne veľkosti

Autor: Sanne Grinovero
Z prezentácie sa dozviete, ako Quarkus vznikol, ako funguje a ako vám umožňuje vytvárať zložité knižnice, ako napríklad Hibernate ORM, kompatibilné s natívnymi obrázkami GraalVM.

4. Naučte sa vyvíjať aplikácie bez servera

Autor: Martin Luther
Video nižšie ukazuje, ako vytvoriť jednoduchú Java aplikáciu pomocou Quarkus a nasadiť ju ako bezserverovú aplikáciu na Knative.

5. Quarkus: Bavte sa pri kódovaní

Autor: Edson Yanaga
Video sprievodca vytvorením vášho prvého projektu Quarkus, ktorý vám umožní pochopiť, prečo si Quarkus získava srdcia vývojárov.

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

Uverejnil Mark Little
Táto prezentácia predstavuje históriu Javy a vysvetľuje, prečo je Quarkus budúcnosťou Javy.

7. Quarkus: Superfast Subatomic Java

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

8. Kvarkusové a subatomárne raketové systémy

Autor: Clement Escoffier
Vďaka integrácii s GraalVM poskytuje Quarkus ultrarýchly vývojový zážitok a subatomárne runtime prostredie. Autor hovorí o reaktívnej stránke Quarkus a o tom, ako ju použiť na vytváranie reaktívnych a streamingových aplikácií.

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

Autor: John Clingan
Kombináciou Eclipse MicroProfile a Quarkus môžu vývojári vytvárať plnohodnotné kontajnerové aplikácie MicroProfile, ktoré sa spúšťajú v desiatkach milisekúnd. Video podrobne popisuje, ako kódovať kontajnerizovanú aplikáciu MicroProfile na nasadenie na platforme Kubernetes.

10. Java, verzia "Turbo".

Autor: Marcus Biel
Autor ukazuje, ako použiť Quarkus na vytvorenie super malých, super rýchlych Java kontajnerov, ktoré umožňujú skutočné prielomy, najmä v prostrediach bez serverov.



Zdroj: hab.com

Pridať komentár