Kā Quarkus apvieno imperatÄ«vo un reaktÄ«vo programmÄ“Å”anu

Å ogad plānojam nopietni attÄ«stÄ«t konteineru tēmas, Mākoņa vietējā Java Šø Kubernetes. LoÄ£isks Å”o tēmu turpinājums jau bÅ«s stāsts par Quarkus ietvaru apsvērts uz Habrē. Å odienas raksts ir mazāks par "subatomiskās superātrās Java" dizainu un vairāk par solÄ«jumu, ko Quarkus sniedz uzņēmumam.

Kā Quarkus apvieno imperatÄ«vo un reaktÄ«vo programmÄ“Å”anu

Java un JVM joprojām ir ārkārtÄ«gi populāri, taču, strādājot ar bezserveru tehnoloÄ£ijām un mākoņpakalpojumiem, Java un citas JVM valodas tiek izmantotas arvien retāk, jo tās aizņem pārāk daudz vietas atmiņā un ir pārāk lēnas, lai tās ielādētu. slikti piemērots lietoÅ”anai ar Ä«slaicÄ«giem traukiem. Par laimi, Ŕī situācija tagad sāk mainÄ«ties, pateicoties Quarkus.

Superātrā subatomiskā Java ir sasniegusi jaunu līmeni!

42 izlaidumi, 8 mēneÅ”i kopienas darba un 177 brÄ«niŔķīgi izstrādātāji ā€” tā visa rezultāts bija izlaiÅ”ana 2019. gada novembrÄ« Kvarkuss 1.0, laidiens, kas iezÄ«mē svarÄ«gu pavērsienu projekta attÄ«stÄ«bā un piedāvā daudz lielisku funkciju un iespēju (vairāk par tām varat lasÄ«t paziņojums).

Å odien mēs parādÄ«sim, kā Quarkus apvieno imperatÄ«vos un reaktÄ«vos programmÄ“Å”anas modeļus vienā reaktÄ«vā kodolā. Mēs sāksim ar Ä«su vēsturi un pēc tam iedziļināsimies sÄ«kāk par to, kas ir Quarkus reaktÄ«vais kodola duālisms un kā Java-Izstrādātāji var izmantot Ŕīs priekÅ”rocÄ«bas.

Mikropakalpojumi, notikumu virzÄ«tas arhitektÅ«ras Šø serverless-funkcijas ā€“ tas viss, kā saka, Å”odien pieaug. Pēdējā laikā uz mākoņiem orientētu arhitektÅ«ru izveide ir kļuvusi daudz vienkārŔāka un pieejamāka, taču problēmas joprojām pastāv ā€“ Ä«paÅ”i Java izstrādātājiem. Piemēram, bezserveru funkciju un mikropakalpojumu gadÄ«jumā ir steidzami jāsamazina palaiÅ”anas laiks, jāsamazina atmiņas patēriņŔ un tomēr jāpadara to izstrāde ērtāka un patÄ«kamāka. Java pēdējos gados ir veikusi vairākus uzlabojumus, piemēram, uzlabojusi konteineru ergonomikas funkcionalitāti un tā tālāk. Tomēr joprojām ir grÅ«ti panākt, lai Java pareizi darbotos konteinerā. Tāpēc sāksim, aplÅ«kojot dažas Java raksturÄ«gās sarežģītÄ«bas, kas ir Ä«paÅ”i aktuālas, izstrādājot uz konteineriem orientētas Java lietojumprogrammas.

Vispirms apskatīsim vēsturi.

Kā Quarkus apvieno imperatÄ«vo un reaktÄ«vo programmÄ“Å”anu

Straumes un konteineri

Sākot ar versiju 8u131, ergonomikas funkcionalitātes uzlabojumu dēļ Java sāka vairāk vai mazāk atbalstÄ«t konteinerus. Jo Ä«paÅ”i JVM tagad zina, cik procesora kodolos tas darbojas, un var attiecÄ«gi konfigurēt pavedienu pÅ«lus, parasti sadalot/pievienoties pÅ«liem. Protams, tas ir lieliski, taču pieņemsim, ka mums ir tradicionāla tÄ«mekļa lietojumprogramma, kas izmanto HTTP servletus un darbojas Tomcat, Jetty utt. Rezultātā Ŕī lietojumprogramma pieŔķirs katram pieprasÄ«jumam atseviŔķu pavedienu un ļaus tai bloķēt Å”o pavedienu, gaidot I/O darbÄ«bas, piemēram, piekļūstot datu bāzei, failiem vai citiem pakalpojumiem. Tas ir, Ŕādas lietojumprogrammas lielums nav atkarÄ«gs no pieejamo kodolu skaita, bet gan no vienlaicÄ«gu pieprasÄ«jumu skaita. Turklāt tas nozÄ«mē, ka Kubernetes kodolu skaita kvotas vai ierobežojumi Å”eit neko daudz nepalÄ«dzēs, un lieta galu galā beigsies ar droseli.

Atmiņas izsīkums

Pavedieni ir atmiņa. Un konteinera iekŔējās atmiņas ierobežojumi nekādā gadÄ«jumā nav panaceja. VienkārÅ”i sāciet palielināt lietojumprogrammu un pavedienu skaitu, un agrāk vai vēlāk jÅ«s saskarsities ar kritisku pārslēgÅ”anās frekvences pieaugumu un lÄ«dz ar to veiktspējas pasliktināŔanos. Turklāt, ja jÅ«su lietojumprogramma izmanto tradicionālos mikropakalpojumu ietvarus vai izveido savienojumu ar datu bāzi, izmanto keÅ”atmiņu vai citādi izmanto atmiņu, jums acÄ«mredzot ir nepiecieÅ”ams rÄ«ks, kas ļauj ieskatÄ«ties JVM iekÅ”ienē un redzēt, kā tā pārvalda atmiņu, to neapdraudot. Pats JVM (piemēram, XX:+UseCGroupMemoryLimitForHeap). Un, lai gan kopÅ” Java 9 JVM ir iemācÄ«jies pieņemt cgroups un attiecÄ«gi pielāgoties, atmiņas rezervÄ“Å”ana un pārvaldÄ«ba joprojām ir diezgan sarežģīts jautājums.

Kvotas un limiti

Java 11 ieviesa atbalstu CPU kvotām (piemēram, PreferContainerQuotaForCPUCount). Kubernetes piedāvā arÄ« atbalstu ierobežojumiem un kvotām. Jā, tam visam ir jēga, taču, ja lietojumprogramma atkal pārsniedz pieŔķirto kvotu, mēs atkal nonākam pie tā lieluma - kā tas ir tradicionālajām Java lietojumprogrammām -, ko nosaka kodolu skaits un katram atseviŔķa pavediena pieŔķirÅ”ana. lÅ«gumu, tad no tā visa maz jēgas.
Turklāt, ja izmantojat kvotas un ierobežojumus vai Kubernetes pamatā esoŔās platformas mērogoÅ”anas funkcijas, problēma pati par sevi neatrisinās. Mēs vienkārÅ”i tērējam vairāk resursu sākotnējās problēmas risināŔanai vai galu galā pārtērējam. Un, ja tā ir lielas slodzes sistēma publiskā publiskā mākonÄ«, mēs gandrÄ«z noteikti galu galā patērēsim vairāk resursu, nekā mums patieŔām nepiecieÅ”ams.

Un ko ar Ŕo visu iesākt?

VienkārÅ”i sakot, izmantojiet asinhronas un nebloķējoÅ”as I/O bibliotēkas un ietvarus, piemēram, Netty, Vert.x vai Akka. Tie ir daudz labāk piemēroti darbam konteineros to reaktÄ«vā rakstura dēļ. Pateicoties nebloķējoÅ”ajam I/O, viens un tas pats pavediens var apstrādāt vairākus vienlaicÄ«gus pieprasÄ«jumus. Kamēr viens pieprasÄ«jums gaida ievades/izvades rezultātus, tā pavedienu apstrāde tiek atbrÄ«vota un pārņemta citā pieprasÄ«jumā. Kad beidzot tiek saņemti ievades/izvades rezultāti, pirmā pieprasÄ«juma apstrāde turpinās. Apstrādājot pieprasÄ«jumus vienā pavedienā, varat samazināt kopējo pavedienu skaitu un samazināt resursu patēriņu pieprasÄ«jumu apstrādei.

Izmantojot nebloķējoÅ”o I/O, kodolu skaits kļūst par galveno parametru, jo tas nosaka paralēli izpildāmo I/O pavedienu skaitu. Pareizi lietojot, tas ļauj efektÄ«vi sadalÄ«t slodzi starp kodoliem un apstrādāt lielāku darba slodzi ar mazākiem resursiem.

Kā, vai tas ir viss?

Nē, ir kaut kas cits. ReaktÄ«vā programmÄ“Å”ana palÄ«dz labāk izmantot resursus, taču tai ir arÄ« sava cena. Jo Ä«paÅ”i kods bÅ«s jāpārraksta saskaņā ar nebloÄ·Ä“Å”anas principiem un jāizvairās no I/O pavedienu bloÄ·Ä“Å”anas. Un tas ir pavisam cits izstrādes un izpildes modelis. Un, lai gan Å”eit ir daudz noderÄ«gu bibliotēku, tās joprojām ir radikālas izmaiņas ierastajā domāŔanas veidā.

Pirmkārt, jums jāiemācās rakstÄ«t kodu, kas darbojas asinhroni. Kad sākat izmantot nebloķējoÅ”o I/O, jums ir skaidri jānorāda, kas jānotiek, kad tiek saņemta atbilde uz pieprasÄ«jumu. VienkārÅ”i bloÄ·Ä“Å”ana un gaidÄ«Å”ana vairs nedarbosies. Tā vietā varat pārsÅ«tÄ«t atzvanÄ«Å”anu, izmantot reaktÄ«vo programmÄ“Å”anu vai turpinājumu. Bet tas vēl nav viss: lai izmantotu nebloķējoÅ”u I/O, ir nepiecieÅ”ami gan nebloķējoÅ”i serveri, gan klienti, vēlams visur. HTTP gadÄ«jumā viss ir vienkārÅ”i, taču ir arÄ« datu bāzes, failu sistēmas un daudz kas cits.

Un, lai gan kopējā reaktivitāte no gala lÄ«dz galam palielina efektivitāti, praksē Ŕādu pāreju var bÅ«t grÅ«ti uztvert. Tāpēc iespēja apvienot reaktÄ«vo un imperatÄ«vo kodu kļūst par priekÅ”noteikumu, lai:

  1. Efektīvi izmantot resursus programmatūras sistēmas visvairāk noslogotajās vietās;
  2. Pārējās daļās izmantojiet vienkārŔāku stila kodu.

Iepazīstinām ar Quarkus

PatiesÄ«bā Ŕī ir Quarkus bÅ«tÄ«ba - apvienot reaktÄ«vos un imperatÄ«vos modeļus vienā izpildlaika vidē.

Quarkus pamatā ir Vert.x un Netty, ar virkni reaktÄ«vu ietvaru un paplaÅ”inājumu, kas palÄ«dz izstrādātājam. Quarkus ir paredzēts ne tikai HTTP mikropakalpojumu, bet arÄ« notikumu virzÄ«tu arhitektÅ«ru veidoÅ”anai. ReaktÄ«vā rakstura dēļ tas ļoti efektÄ«vi darbojas ar ziņojumapmaiņas sistēmām (Apache Kafka, AMQP utt.).

ViltÄ«ba ir tāda, kā izmantot vienu un to paÅ”u reaktÄ«vo dzinēju gan obligātajam, gan reaktÄ«vajam kodam.

Kā Quarkus apvieno imperatÄ«vo un reaktÄ«vo programmÄ“Å”anu

Quarkus to dara lieliski. Izvēle starp imperatÄ«vo un reaktÄ«vo ir acÄ«mredzama - izmantojiet reaktÄ«vo kodolu abiem. Tas patieŔām palÄ«dz ātrs, nebloķējoÅ”s kods, kas apstrādā gandrÄ«z visu, kas iet caur notikumu cilpas pavedienu jeb IO pavedienu. Bet, ja jums ir klasiskās REST vai klienta puses lietojumprogrammas, Quarkus ir gatavs obligāts programmÄ“Å”anas modelis. Piemēram, HTTP atbalsts Quarkus ir balstÄ«ts uz nebloķējoÅ”a un reaktÄ«va dzinēja (Eclipse Vert.x un Netty) izmantoÅ”anu. Visi jÅ«su lietojumprogrammas saņemtie HTTP pieprasÄ«jumi vispirms tiek nosÅ«tÄ«ti caur notikumu cilpu (IO Thread) un pēc tam tiek nosÅ«tÄ«ti uz koda daļu, kas pārvalda pieprasÄ«jumus. AtkarÄ«bā no galamērÄ·a pieprasÄ«juma pārvaldÄ«bas kodu var izsaukt atseviŔķā pavedienā (tā sauktajā darbinieka pavedienā, ko izmanto servletu un Jax-RS gadÄ«jumā) vai izmantot avota I/O pavedienu (reaktÄ«vais marÅ”ruts).

Kā Quarkus apvieno imperatÄ«vo un reaktÄ«vo programmÄ“Å”anu

Ziņojumapmaiņas sistēmas savienotāji izmanto nebloķējoÅ”us klientus, kas darbojas Vert.x dzinēja augÅ”daļā. Tādējādi jÅ«s varat efektÄ«vi nosÅ«tÄ«t, saņemt un apstrādāt ziņojumus no ziņojumapmaiņas starpprogrammatÅ«ras sistēmām.

Vietā Quarkus.io Šeit ir dažas labas pamācības, kas palīdzēs jums sākt darbu ar Quarkus:

Mēs esam arÄ« izveidojuÅ”i tieÅ”saistes praktiskas apmācÄ«bas, lai iemācÄ«tu jums dažādus reaktÄ«vās programmÄ“Å”anas aspektus tikai pārlÅ«kprogrammā, nav nepiecieÅ”ama IDE un nav nepiecieÅ”ams dators. JÅ«s varat atrast Ŕīs nodarbÄ«bas Å”eit.

Noderīgi resursi

10 video nodarbības par Quarkus, lai iepazītos ar tēmu

Kā saka vietnē Quarkus.io, Kvarkuss - Vai Kubernetes-orientēta Java kaudze, kas pielāgota GraalVM un OpenJDK HotSpot un samontēta no labākajām Java bibliotēkām un standartiem.

Lai palÄ«dzētu jums izprast tēmu, esam atlasÄ«juÅ”i 10 video pamācÄ«bas, kas aptver dažādus Quarkus aspektus un tā izmantoÅ”anas piemērus:

1. Iepazīstinām ar Quarkus: Kubernetes nākamās paaudzes Java ietvars

Tomass Kvarnstroms un Džeisons Grīns
Quarkus projekta mērÄ·is ir izveidot Java platformu Kubernetes un bezserveru vidēm, kā arÄ« apvienot reaktÄ«vos un imperatÄ«vos programmÄ“Å”anas modeļus vienā izpildlaika vidē, lai izstrādātāji varētu elastÄ«gi mainÄ«t savu pieeju, strādājot ar plaÅ”u izplatÄ«to lietojumprogrammu arhitektÅ«ru klāstu. Vairāk uzzini zemāk esoÅ”ajā ievadlekcijā.

2. Quarkus: Superfast Subatomic Java

Autors: Burrs Saters
Šī DevNation Live video apmācība parāda, kā izmantot Quarkus, lai optimizētu uzņēmuma Java lietojumprogrammas, API, mikropakalpojumus un bezservera funkcijas Kubernetes/OpenShift vidē, padarot tās daudz mazākas, ātrākas un mērogojamākas.

3. Quarkus un GraalVM: hibernācijas paātrināŔana lÄ«dz lieliem ātrumiem un tā samazināŔana lÄ«dz subatomiskiem izmēriem

Autors: Sanne Grinovero
No prezentācijas jūs uzzināsit, kā Quarkus radās, kā tas darbojas un kā tas ļauj izveidot sarežģītas bibliotēkas, piemēram, Hibernate ORM, saderīgas ar vietējiem GraalVM attēliem.

4. Iemācieties izstrādāt lietojumprogrammas bez serveriem

Autors: MārtiņŔ Luters
Tālāk esoÅ”ajā videoklipā parādÄ«ts, kā izveidot vienkārÅ”u Java lietojumprogrammu, izmantojot Quarkus, un izvietot to kā bezservera lietojumprogrammu vietnē Knative.

5. Quarkus: ir jautri kodēŔana

Autors: Edsons Janaga
Video ceļvedis sava pirmā Quarkus projekta izveidei, kas ļauj saprast, kāpēc Quarkus iekaro izstrādātāju sirdis.

6. Java un konteineri ā€“ kāda bÅ«s viņu nākotne kopā

Iesūtījis Marks Litls
Šī prezentācija iepazīstina ar Java vēsturi un izskaidro, kāpēc Quarkus ir Java nākotne.

7. Quarkus: Superfast Subatomic Java

Autors: Dimitris Andreadis
Pārskats par Quarkus priekÅ”rocÄ«bām, kas saņēmuÅ”as izstrādātāju atzinÄ«bu: vienkārŔība, Ä«paÅ”i lieli ātrumi, labākās bibliotēkas un standarti.

8. Kvarkus un subatomiskās raÄ·eÅ”u sistēmas

Autors: Klements Eskofjē
Pateicoties integrācijai ar GraalVM, Quarkus nodroÅ”ina Ä«paÅ”i ātru izstrādes pieredzi un subatomisku izpildlaika vidi. Autors stāsta par Quarkus reaktÄ«vo pusi un to, kā to izmantot, lai izveidotu reaktÄ«vas un straumÄ“Å”anas lietojumprogrammas.

9. Quarkus un ātra aplikāciju izstrāde Eclipse MicroProfile

Autors: Džons Klingans
Apvienojot Eclipse MicroProfile un Quarkus, izstrādātāji var izveidot pilna funkcionalitāte konteinerizētas MicroProfile lietojumprogrammas, kas tiek palaistas desmitiem milisekundēs. Video ir detalizēti aprakstÄ«ts, kā kodēt konteinerizētu MicroProfile lietojumprogrammu izvietoÅ”anai Kubernetes platformā.

10. Java, "Turbo" versija

Autors: Markuss BÄ«ls
Autors parāda, kā izmantot Quarkus, lai izveidotu Ä«paÅ”i mazus, Ä«paÅ”i ātrus Java konteinerus, kas nodroÅ”ina reālus sasniegumus, Ä«paÅ”i vidēs bez serveriem.



Avots: www.habr.com

Pievieno komentāru