Si kombinon Quarkus programimin imperativ dhe reaktiv

Këtë vit ne planifikojmë të zhvillojmë seriozisht temat e kontejnerëve, Cloud-Native Java и Kubernetes. Një vazhdim logjik i këtyre temave do të jetë një histori rreth kornizës së Quarkus, tashmë konsiderohen në Habré. Artikulli i sotëm ka të bëjë më pak me dizajnin e "Java subatomike super të shpejtë" dhe më shumë për premtimin që Quarkus i sjell Enterprise.

Si kombinon Quarkus programimin imperativ dhe reaktiv

Java dhe JVM janë ende jashtëzakonisht të njohura, por kur punoni me teknologjitë pa server dhe mikroshërbimet vendase në renë kompjuterike, Java dhe gjuhët e tjera JVM përdoren gjithnjë e më pak sepse zënë shumë hapësirë ​​​​memorie dhe janë shumë të ngadalta për t'u ngarkuar, duke i bërë ato i përshtatshëm për përdorim me kontejnerë jetëshkurtër. Për fat të mirë, kjo situatë tani ka filluar të ndryshojë falë Quarkus.

Java super e shpejtë subatomike ka arritur një nivel të ri!

42 publikime, 8 muaj punë në komunitet dhe 177 zhvillues të mrekullueshëm - rezultati i të gjithave ishte publikimi në nëntor 2019 Kuarku 1.0, një version që shënon një moment historik të rëndësishëm në zhvillimin e projektit dhe ofron shumë veçori dhe aftësi interesante (mund të lexoni më shumë rreth tyre në shpallje).

Sot do t'ju tregojmë se si Quarkus kombinon modelet e programimit imperativ dhe reaktiv në një bërthamë të vetme reaktive. Ne do të fillojmë me një histori të shkurtër dhe më pas do të shkojmë në detaje se çfarë është dualizmi bërthamor reaktiv i Quarkus dhe si Java-Zhvilluesit mund të përfitojnë nga këto përfitime.

Mikroshërbime, Arkitekturat e drejtuara nga ngjarjet и pa server-funksionet - e gjithë kjo, siç thonë ata, sot është në rritje. Kohët e fundit, krijimi i arkitekturave me qendër në renë kompjuterike është bërë shumë më i lehtë dhe më i arritshëm, por problemet mbeten - veçanërisht për zhvilluesit e Java. Për shembull, në rastin e funksioneve dhe mikroshërbimeve pa server, ekziston një nevojë urgjente për të reduktuar kohën e fillimit, për të zvogëluar konsumin e kujtesës dhe për ta bërë zhvillimin e tyre më të përshtatshëm dhe të këndshëm. Java ka bërë disa përmirësime vitet e fundit, të tilla si funksionaliteti i përmirësuar i ergonomisë për kontejnerët etj. Sidoqoftë, të bësh Java të funksionojë siç duhet në një kontejner është ende sfiduese. Pra, ne do të fillojmë duke parë disa nga kompleksitetet e qenësishme të Java, të cilat janë veçanërisht të mprehta kur zhvillohen aplikacione Java të orientuara nga kontejnerët.

Së pari, le të shohim historinë.

Si kombinon Quarkus programimin imperativ dhe reaktiv

Rrjedhat dhe kontejnerët

Duke filluar me versionin 8u131, Java filloi të mbështesë pak a shumë kontejnerët për shkak të përmirësimeve në funksionalitetin e ergonomisë. Në veçanti, JVM tani e di se me sa bërthama procesori po funksionon dhe mund të konfigurojë grupet e thread-ve - zakonisht grupet e forkimit/bashkimit - në përputhje me rrethanat. Sigurisht, kjo është e mrekullueshme, por le të themi se kemi një aplikacion tradicional në internet që përdor serverat HTTP dhe ekzekutohet në Tomcat, Jetty, etj. Si rezultat, ky aplikacion do t'i japë çdo kërkese një thread të veçantë dhe do ta lejojë atë të bllokojë këtë thread ndërsa pret për operacionet I/O, për shembull, kur hyn në bazën e të dhënave, skedarët ose shërbime të tjera. Kjo do të thotë, madhësia e një aplikacioni të tillë nuk varet nga numri i bërthamave të disponueshme, por nga numri i kërkesave të njëkohshme. Për më tepër, kjo do të thotë që kuotat ose kufizimet në Kubernetes në numrin e bërthamave nuk do të ndihmojnë shumë këtu, dhe çështja përfundimisht do të përfundojë në mbytje.

Lodhje e kujtesës

Fijet janë memorie. Dhe kufizimet e kujtesës brenda kontejnerit nuk janë aspak një ilaç. Thjesht filloni të rritni numrin e aplikacioneve dhe temave dhe herët a vonë do të hasni një rritje kritike të frekuencës së ndërrimit dhe, si rezultat, degradim të performancës. Gjithashtu, nëse aplikacioni juaj përdor korniza tradicionale të mikroshërbimit, ose lidhet me një bazë të dhënash, ose përdor caching, ose përdor memorie ndryshe, padyshim që ju nevojitet një mjet që ju lejon të shikoni brenda JVM dhe të shihni se si e menaxhon memorien pa e vrarë atë. Vetë JVM (për shembull, XX:+UseCGroupMemoryLimitForHeap). Edhe pse, që nga Java 9, JVM ka mësuar të pranojë cgrupe dhe të përshtatet në përputhje me rrethanat, rezervimi dhe menaxhimi i kujtesës mbetet një çështje mjaft komplekse.

Kuotat dhe kufijtë

Java 11 prezantoi mbështetje për kuotat e CPU (si PreferContainerQuotaForCPUCount). Kubernetes gjithashtu ofron mbështetje për kufijtë dhe kuotat. Po, e gjithë kjo ka kuptim, por nëse aplikacioni përsëri tejkalon kuotën e caktuar, ne përsëri përfundojmë me madhësinë - siç është rasti me aplikacionet tradicionale Java - të përcaktuara nga numri i bërthamave dhe me ndarjen e një filli të veçantë për secilën kërkesë, atëherë ka pak kuptim në të gjithë këtë.
Për më tepër, nëse përdorni kuotat dhe kufijtë ose funksionet e shkallëzimit të platformës në bazë të Kubernetes, problemi gjithashtu nuk zgjidhet vetë. Ne thjesht shpenzojmë më shumë burime për zgjidhjen e problemit fillestar ose përfundojmë duke shpenzuar. Dhe nëse është një sistem me ngarkesë të lartë në një re publike publike, ne pothuajse me siguri do të përfundojmë duke përdorur më shumë burime sesa na duhen vërtet.

Dhe çfarë të bëni me gjithë këtë?

Për ta thënë thjesht, përdorni bibliotekat dhe kornizat e hyrjes/daljes asinkrone dhe jo-bllokuese si Netty, Vert.x ose Akka. Ato janë shumë më të përshtatshme për të punuar në kontejnerë për shkak të natyrës së tyre reaktive. Falë I/O jo-bllokuese, i njëjti thread mund të përpunojë kërkesa të shumta të njëkohshme. Ndërsa një kërkesë është duke pritur për rezultatet I/O, thread-i që e përpunon atë lëshohet dhe merret përsipër nga një kërkesë tjetër. Dhe kur rezultatet I/O arrijnë përfundimisht, përpunimi i kërkesës së parë vazhdon. Me përpunimin e ndërthurur të kërkesave brenda të njëjtit thread, ju mund të zvogëloni numrin total të thread-ve dhe të zvogëloni konsumin e burimeve për përpunimin e kërkesave.

Me I/O jo-bllokuese, numri i bërthamave bëhet një parametër kyç sepse përcakton numrin e thread-ve I/O që mund të ekzekutohen paralelisht. Kur përdoret si duhet, kjo ju lejon të shpërndani në mënyrë efektive ngarkesën midis bërthamave dhe të trajtoni ngarkesa më të larta pune me më pak burime.

Si, është e gjitha kjo?

Jo, ka diçka tjetër. Programimi reaktiv ndihmon në përdorimin më të mirë të burimeve, por gjithashtu ka një çmim. Në veçanti, kodi do të duhet të rishkruhet sipas parimeve të mosbllokimit dhe të shmanget bllokimi i fijeve I/O. Dhe ky është një model krejtësisht i ndryshëm zhvillimi dhe ekzekutimi. Dhe megjithëse ka shumë biblioteka të dobishme këtu, është ende një ndryshim rrënjësor në mënyrën e zakonshme të të menduarit.

Së pari, duhet të mësoni se si të shkruani kodin që funksionon në mënyrë asinkrone. Pasi të filloni të përdorni I/O pa bllokim, duhet të specifikoni në mënyrë eksplicite se çfarë duhet të ndodhë kur të merret një përgjigje ndaj një kërkese. Thjesht bllokimi dhe pritja nuk do të funksionojnë më. Në vend të kësaj, mund të kaloni kthime thirrjesh, të përdorni programim reaktiv ose vazhdim. Por kjo nuk është e gjitha: për të përdorur I/O pa bllokim, ju nevojiten edhe serverë edhe klientë që nuk bllokojnë, mundësisht kudo. Në rastin e HTTP, gjithçka është e thjeshtë, por ka edhe baza të dhënash, sisteme skedarësh dhe shumë më tepër.

Dhe megjithëse reaktiviteti total nga skaji në skaj maksimizon efikasitetin, një zhvendosje e tillë mund të jetë e vështirë për t'u përballur në praktikë. Prandaj, aftësia për të kombinuar kodin reaktiv dhe imperativ bëhet një parakusht për të:

  1. Përdorni në mënyrë efektive burimet në zonat më të ngarkuara të sistemit softuerik;
  2. Përdorni kodin më të thjeshtë të stilit në pjesët e tij të mbetura.

Prezantimi i Quarkus

Në fakt, ky është thelbi i Quarkus - për të kombinuar modelet reaktive dhe imperative brenda një mjedisi të vetëm ekzekutimi.

Quarkus bazohet në Vert.x dhe Netty, me një sërë kornizash reaktive dhe shtesash në krye për të ndihmuar zhvilluesin. Quarkus është krijuar për të ndërtuar jo vetëm mikroshërbime HTTP, por edhe arkitektura të drejtuara nga ngjarjet. Për shkak të natyrës së tij reaktive, ai punon në mënyrë shumë efektive me sistemet e mesazheve (Apache Kafka, AMQP, etj.).

Truku është se si të përdorni të njëjtin motor reaktiv si për kodin imperativ ashtu edhe për atë reaktiv.

Si kombinon Quarkus programimin imperativ dhe reaktiv

Quarkus e bën këtë në mënyrë të shkëlqyer. Zgjedhja midis imperativit dhe reaktivit është e qartë - përdorni një kernel reaktiv për të dyja. Ajo me të cilën ndihmon vërtet është kodi i shpejtë dhe jo-bllokues që trajton pothuajse gjithçka që kalon nëpër fillin e ciklit të ngjarjeve, i njohur ndryshe si filli IO. Por nëse keni aplikacione klasike REST ose nga ana e klientit, Quarkus ka gati një model programimi imperativ. Për shembull, mbështetja HTTP në Quarkus bazohet në përdorimin e një motori jo-bllokues dhe reaktiv (Eclipse Vert.x dhe Netty). Të gjitha kërkesat HTTP të marra nga aplikacioni juaj fillimisht kalohen përmes një qarku ngjarjesh (IO Thread) dhe më pas dërgohen në pjesën e kodit që menaxhon kërkesat. Në varësi të destinacionit, kodi i menaxhimit të kërkesës mund të thirret brenda një thread të veçantë (i ashtuquajturi thread i punëtorit, i përdorur në rastin e servlets dhe Jax-RS) ose të përdorë thread-in burimor I/O (rruga reaktive).

Si kombinon Quarkus programimin imperativ dhe reaktiv

Lidhësit e sistemit të mesazheve përdorin klientë jo-bllokues që funksionojnë në krye të motorit Vert.x. Prandaj, ju mund të dërgoni, merrni dhe përpunoni në mënyrë efektive mesazhe nga sistemet e programeve të mesme të mesazheve.

Faqe Quarkus.io Këtu janë disa mësime të mira për t'ju ndihmuar të filloni me Quarkus:

Ne kemi krijuar gjithashtu mësime praktike në internet për t'ju mësuar aspekte të ndryshme të programimit reaktiv vetëm në një shfletues, nuk kërkohet IDE dhe nuk kërkohet kompjuter. Ju mund t'i gjeni këto mësime këtu.

Burime të dobishme

10 video mësime mbi Quarkus për t'u njohur me temën

Siç thonë në faqen e internetit Quarkus.io, Kuarkus - kjo KubernetesStack Java e orientuar, e përshtatur për GraalVM dhe OpenJDK HotSpot dhe e mbledhur nga bibliotekat dhe standardet më të mira Java.

Për t'ju ndihmuar të kuptoni temën, ne kemi zgjedhur 10 video mësimore që mbulojnë aspekte të ndryshme të Quarkus dhe shembuj të përdorimit të tij:

1. Prezantimi i Quarkus: Korniza Java e Gjeneratës tjetër për Kubernetes

Nga Thomas Qvarnstrom dhe Jason Greene
Qëllimi i projektit Quarkus është të krijojë një platformë Java për Kubernetes dhe mjedise pa server, dhe të kombinojë modelet e programimit reaktiv dhe imperativ në një mjedis të vetëm ekzekutimi, në mënyrë që zhvilluesit të mund të ndryshojnë në mënyrë fleksibël qasjen e tyre kur punojnë me një gamë të gjerë të arkitekturave të aplikacioneve të shpërndara. Zbuloni më shumë në leksionin hyrës më poshtë.

2. Kuarkusi: Java super e shpejtë subatomike

Nga: Burr Sutter
Ky video tutorial nga DevNation Live demonstron se si të përdorni Quarkus për të optimizuar aplikacionet Java të ndërmarrjeve, API-të, mikroshërbimet dhe funksionet pa server në një mjedis Kubernetes/OpenShift, duke i bërë ato shumë më të vogla, më të shpejta dhe më të shkallëzueshme.

3. Quarkus dhe GraalVM: përshpejtimi i Hibernate në shpejtësi super dhe zvogëlimi i tij në madhësi nënatomike

Autor: Sanne Grinovero
Nga prezantimi do të mësoni se si u krijua Quarkus, si funksionon dhe si ju lejon të bëni biblioteka komplekse, si Hibernate ORM, të pajtueshme me imazhet vendase të GraalVM.

4. Mësoni të zhvilloni aplikacione pa server

Autori: Martin Luther
Videoja më poshtë tregon se si të krijoni një aplikacion të thjeshtë Java duke përdorur Quarkus dhe ta vendosni atë si një aplikacion pa server në Knative.

5. Kuarkusi: Argëtohuni me kodimin

Autori: Edson Yanaga
Një udhëzues video për krijimin e projektit tuaj të parë Quarkus, që ju lejon të kuptoni pse Quarkus po fiton zemrat e zhvilluesve.

6. Java dhe kontejnerët - cila do të jetë e ardhmja e tyre së bashku

Postuar nga Mark Little
Ky prezantim prezanton historinë e Java dhe shpjegon pse Quarkus është e ardhmja e Java.

7. Kuarkusi: Java super e shpejtë subatomike

Autor: Dimitris Andreadis
Një përmbledhje e avantazheve të Quarkus që janë njohur nga zhvilluesit: thjeshtësia, shpejtësitë ultra të larta, bibliotekat dhe standardet më të mira.

8. Kuarkusi dhe sistemet e raketave nënatomike

Autori: Clement Escoffier
Nëpërmjet integrimit me GraalVM, Quarkus ofron një përvojë zhvillimi ultra të shpejtë dhe një mjedis nënatomik të ekzekutimit. Autori flet për anën reaktive të Quarkus dhe mënyrën e përdorimit të tij për të ndërtuar aplikacione reaktive dhe transmetimi.

9. Kuarkusi dhe zhvillimi i shpejtë i aplikacioneve në Eclipse MicroProfile

Autori: John Clingan
Duke kombinuar Eclipse MicroProfile dhe Quarkus, zhvilluesit mund të krijojnë aplikacione MicroProfile me funksione të plota që nisin në dhjetëra milisekonda. Videoja jep detaje se si të kodoni një aplikacion MicroProfile të kontejneruar për t'u vendosur në platformën Kubernetes.

10. Java, versioni "Turbo".

Autori: Marcus Biel
Autori tregon se si të përdoret Quarkus për të krijuar kontejnerë Java super të vegjël dhe super të shpejtë që mundësojnë përparime reale, veçanërisht në mjediset pa server.



Burimi: www.habr.com

Shto një koment