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.
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.
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:
EfektÄ«vi izmantot resursus programmatÅ«ras sistÄmas visvairÄk noslogotajÄs vietÄs;
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.
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).
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.
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.