Quarkusek programazio inperatiboa eta erreaktiboa nola uztartzen dituen

Aurten edukiontzien gaiak serio garatzeko asmoa dugu, Hodei-jatorrizko Java ΠΈ Kubernetes. Gai hauen jarraipena logikoa Quarkus esparruari buruzko istorio bat izango da, dagoeneko kontuan hartuta HabrΓ©-n. Gaurko artikuluak "Java superfast subatomikoaren" diseinuari buruz eta Quarkusek Enterprise-ri ekartzen dion promesari buruzkoa da.

Quarkusek programazio inperatiboa eta erreaktiboa nola uztartzen dituen

Java eta JVM oso ezagunak dira oraindik, baina zerbitzaririk gabeko teknologiekin eta hodeiko jatorrizko mikrozerbitzuekin lan egiten dutenean, Java eta beste JVM lengoaiak gero eta gutxiago erabiltzen dira, memoria-espazio gehiegi hartzen dutelako eta kargatzeko motelegiak direlako. ez da egokia iraupen laburreko ontziekin erabiltzeko. Zorionez, egoera hau aldatzen hasi da Quarkusi esker.

Java subatomiko superbizkorra maila berri batera iritsi da!

42 bertsio, 8 hilabete komunitateko lana eta 177 garatzaile harrigarri - horren guztiaren emaitza 2019ko azaroan atera zen Quarkus 1.0, proiektuaren garapenean mugarri garrantzitsua markatzen duen bertsioa eta ezaugarri eta gaitasun eder asko eskaintzen dituena (haiei buruz gehiago irakur dezakezu iragarkia).

Gaur Quarkusek programazio eredu inperatiboak eta erreaktiboak nukleo erreaktibo bakar batean nola konbinatzen dituen erakutsiko dizugu. Historia labur batekin hasiko gara eta, ondoren, Quarkus-en nukleo erreaktiboaren dualismoa zer den eta nola Java-Garatzaileek abantaila hauek aprobetxatu ditzakete.

Mikrozerbitzuak, gertaera bultzatutako arkitekturak ΠΈ zerbitzaririk-funtzioak – hau guztia, esaten den bezala, gorakada doa gaur egun. Azkenaldian, hodeian oinarritutako arkitekturak sortzea askoz errazagoa eta eskuragarriagoa bihurtu da, baina arazoak izaten jarraitzen dute, batez ere Java garatzaileentzat. Esaterako, zerbitzaririk gabeko funtzioen eta mikrozerbitzuen kasuan, premiazkoa da abiarazte-denbora murriztea, memoria-kontsumoa murriztea eta, hala ere, haien garapena erosoagoa eta atseginagoa izatea. Javak hainbat hobekuntza egin ditu azken urteotan, hala nola, ontzientzako ergonomia funtzionaltasuna hobetu eta abar. Hala ere, edukiontzi batean Java behar bezala funtziona dezan zaila da oraindik. Beraz, Javaren berezko konplexutasun batzuk aztertzen hasiko gara, edukiontzietara bideratutako Java aplikazioak garatzerakoan bereziki zorrotzak direnak.

Lehenik eta behin, ikus dezagun historia.

Quarkusek programazio inperatiboa eta erreaktiboa nola uztartzen dituen

Errekak eta edukiontziak

8u131 bertsioarekin hasita, Java edukiontziak gutxi-asko onartzen hasi zen, ergonomiaren funtzionalitatean hobekuntzak zirela eta. Bereziki, JVM-k orain badaki zenbat prozesadore nukleotan exekutatzen ari den eta hari multzoak konfigura ditzake (normalean fork/join pools) horren arabera. Noski, hau bikaina da, baina demagun web-aplikazio tradizional bat dugula, HTTP servletak erabiltzen dituena eta Tomcat, Jetty, etab. Ondorioz, aplikazio honek eskaera bakoitzari hari bana emango dio eta hari hori blokeatzeko aukera emango dio I/O eragiketen zain dagoen bitartean, adibidez, datu-basera, fitxategietara edo bestelako zerbitzuetara sartzean. Hau da, aplikazio baten tamaina ez dago erabilgarri dauden nukleo kopuruaren araberakoa, aldibereko eskaera kopuruaren arabera baizik. Gainera, horrek esan nahi du Kubernetes-en nukleoen kopuruari buruzko kuotak edo mugak ez direla hemen laguntza handirik izango, eta azken finean kontua murrizketan amaituko da.

Memoriaren nekea

Hariak memoria dira. Eta edukiontzi barruko memoriaren mugak ez dira inola ere panazea bat. Hasi besterik ez aplikazio eta hari kopurua handitzen, eta lehenago edo beranduago aldatze-maiztasunaren igoera kritikoa topatuko duzu eta, ondorioz, errendimenduaren degradazioa. Gainera, zure aplikazioak mikrozerbitzu-esparru tradizionalak erabiltzen baditu, edo datu-base batera konektatzen bada, edo cachea erabiltzen badu edo bestela memoria erabiltzen badu, jakina, JVM barruan begiratu eta memoria hil gabe nola kudeatzen duen ikusteko tresna bat behar duzu. JVM bera (adibidez, XX:+UseCGroupMemoryLimitForHeap). Eta nahiz eta, Java 9tik aurrera, JVMk cgroup-ak onartzen eta horren arabera egokitzen ikasi duen, memoria erreserbatzea eta kudeatzea nahiko konplexua izaten jarraitzen du.

Kuotak eta mugak

Java 11-k CPU kuoten laguntza sartu zuen (PreferContainerQuotaForCPUCount bezalakoak). Kubernetes-ek muga eta kuoten laguntza ere eskaintzen du. Bai, honek guztiak badu zentzua, baina aplikazioak berriro esleitutako kuota gainditzen badu, berriro ere tamainarekin amaitzen dugu -Java aplikazio tradizionalekin gertatzen den bezala- nukleoen kopuruak eta hari bereizi bat esleitzearekin. eskaera, orduan zentzu gutxi du honek guztiak.
Horrez gain, Kubernetes-en azpian dagoen plataformaren kuotak eta mugak edo eskalatze-funtzioak erabiltzen badituzu, arazoa ere ez da berez konpontzen. Besterik gabe, baliabide gehiago gastatzen ditugu jatorrizko arazoa konpontzeko edo gehiegi gastatzen amaitzen dugu. Eta hodei publiko publiko batean karga handiko sistema bat bada, ia ziur benetan behar baino baliabide gehiago erabiltzen ditugula.

Eta zer egin honekin guztiarekin?

Besterik esanda, erabili Netty bezalako I/O liburutegi eta markoak asinkronoak eta blokeatzen ez direnak, Bert.x edo Akka. Askoz hobeto moldatzen dira ontzietan lan egiteko, izaera erreaktiboa dela eta. Blokeatzen ez den I/O-ri esker, hari berak aldi berean hainbat eskaera prozesatu ditzake. Eskaera bat I/O emaitzen zain dagoen bitartean, hura prozesatzen duen haria askatu eta beste eskaera batek hartzen du. Eta I/O emaitzak azkenean iristen direnean, lehen eskaeraren prozesamenduak jarraitzen du. Hari bereko eskaerak tartekatuta prozesatzen badituzu, hari kopurua murriztu dezakezu eta eskaerak prozesatzeko baliabideen kontsumoa murriztu dezakezu.

Blokeatzen ez diren I/O-rekin, nukleoen kopurua funtsezko parametro bihurtzen da, paraleloan exekutatu daitezkeen I/O hari kopurua zehazten baitu. Behar bezala erabiltzen denean, karga nukleoen artean modu eraginkorrean banatzeko eta lan-karga handiagoak baliabide gutxiagorekin kudeatzeko aukera ematen du.

Nola, hori dena?

Ez, beste zerbait dago. Programazio erreaktiboak baliabideak hobeto erabiltzen laguntzen du, baina prezioa ere badakar. Bereziki, kodea berridatzi beharko da blokeatzerik ezaren printzipioen arabera eta I/O hariak blokeatzea saihestu. Eta garapen eta exekuzio eredu guztiz ezberdina da hau. Eta hemen liburutegi erabilgarri asko dauden arren, ohiko pentsamoldearen aldaketa erabatekoa da oraindik.

Lehenik eta behin, modu asinkronoan exekutatzen den kodea nola idazten ikasi behar duzu. Blokeatzen ez diren I/O erabiltzen hasten zarenean, eskaera baten erantzuna jasotzen denean zer gertatu behar den esplizituki zehaztu behar duzu. Blokeatzea eta itxaroteak ez du funtzionatuko. Horren ordez, deiak pasa ditzakezu, programazio erreaktiboa edo jarraipena erabil dezakezu. Baina hori ez da guztia: blokeorik gabeko I/O erabiltzeko, blokeorik gabeko zerbitzariak eta bezeroak behar dituzu, ahal dela nonahi. HTTPren kasuan, dena erraza da, baina datu-baseak, fitxategi-sistemak eta askoz gehiago ere badaude.

Eta amaierako erreaktibotasun osoak eraginkortasuna maximizatzen duen arren, aldaketa hori praktikan zaila izan daiteke. Beraz, kode erreaktiboa eta inperatiboa konbinatzeko gaitasuna ezinbesteko baldintza bihurtzen da:

  1. Baliabideak modu eraginkorrean erabiltzea software-sistemako eremurik kargatuenetan;
  2. Erabili estilo-kode sinpleagoa gainerako zatietan.

Quarkus aurkezten

Egia esan, hori da Quarkus-en funtsa: eredu erreaktiboak eta ezinbestekoak konbinatzea exekuzio-ingurune bakarrean.

Quarkus Vert.x eta Netty-n oinarritzen da, eta gainean marko eta luzapen erreaktibo ugari ditu garatzaileari laguntzeko. Quarkus HTTP mikrozerbitzuak ez ezik, gertaeren araberako arkitekturak ere eraikitzeko diseinatuta dago. Izaera erreaktiboa dela eta, oso eraginkortasunez funtzionatzen du mezularitza-sistemekin (Apache Kafka, AMQP, etab.).

Trikimailua da nola erabili motor erreaktibo bera kode inperatibo zein erreaktiborako.

Quarkusek programazio inperatiboa eta erreaktiboa nola uztartzen dituen

Quarkusek bikain egiten du hori. Inperatiboa eta erreaktiboaren arteko aukera begi-bistakoa da - erabili nukleo erreaktibo bat bietarako. Benetan laguntzen duena gertaera-begizta haritik pasatzen den ia guztia kudeatzen duen kode azkarra eta ez-blokeatzailea da, IO haria dena. Baina REST edo bezeroaren aldeko aplikazio klasikoak badituzu, Quarkusek programazio eredu ezinbestekoa du prest. Adibidez, Quarkus-en HTTP euskarria blokeatzen ez den eta motor erreaktibo baten erabileran oinarritzen da (Eclipse Vert.x eta Netty). Zure aplikazioak jasotzen dituen HTTP eskaera guztiak gertaeren begizta batetik (IO haria) pasatzen dira eta ondoren eskaerak kudeatzen dituen kodearen zatira bidaltzen dira. Helmugaren arabera, eskaera kudeatzeko kodea aparteko hari baten barruan dei daiteke (langileen haria deritzona, servlet eta Jax-RS kasuan erabiltzen dena) edo iturburuko I/O haria erabili (bide erreaktiboa).

Quarkusek programazio inperatiboa eta erreaktiboa nola uztartzen dituen

Mezularitza-sistemaren konektoreek Vert.x motorearen gainean exekutatzen duten blokeorik gabeko bezeroak erabiltzen dituzte. Hori dela eta, modu eraginkorrean bidali, jaso eta prozesatu ditzakezu mezularitzako middleware sistemetatik mezuak.

Gune Quarkus.io Hona hemen tutorial on batzuk Quarkus-ekin hasten laguntzeko:

Lineako tutorial praktikoak ere sortu ditugu arakatzaile bakarrean programazio erreaktiboaren hainbat alderdi irakasteko, ez IDErik behar eta ez da ordenagailurik behar. Ikasgai hauek aurki ditzakezu Hemen.

Baliabide erabilgarriak

Quarkus-i buruzko 10 bideo ikasgai gaia ezagutzeko

Webgunean esaten duten moduan Quarkus.io, Quarkuak - Is Kubernetesorientatutako Java pila, GraalVM eta OpenJDK HotSpot-erako egokitua eta Java liburutegi eta estandar onenetatik bildua.

Gaia ulertzen laguntzeko, Quarkus-en hainbat alderdi eta erabileraren adibideak biltzen dituzten 10 bideo-tutorial aukeratu ditugu:

1. Quarkus aurkezten: Kubernetesentzako hurrengo belaunaldiko Java markoa

Thomas Qvarnstrom eta Jason Greeneren eskutik
Quarkus proiektuaren helburua da Kubernetes eta zerbitzaririk gabeko inguruneetarako Java plataforma bat sortzea eta programazio eredu erreaktiboak eta ezinbestekoak exekuzio-ingurune bakarrean konbinatzea, garatzaileek beren ikuspegia malgutasunez alda dezaten aplikazio banatutako arkitektura ugarirekin lan egiten dutenean. Informazio gehiago beheko sarrera hitzaldian.

2. Quarkus: Java Subatomiko Superfast

Egilea: Burr Sutter
DevNation Live-ren bideo-tutorial honek Quarkus nola erabiltzen den erakusten du Kubernetes/OpenShift ingurune batean enpresa Java aplikazioak, APIak, mikrozerbitzuak eta zerbitzaririk gabeko funtzioak optimizatzeko, askoz txikiagoak, azkarragoak eta eskalagarriagoak izan daitezen.

3. Quarkus eta GraalVM: Hibernate abiadura handietara bizkortzea eta tamaina subatomikoetara murriztea

Egilea: Sanne Grinovero
Aurkezpenetik Quarkus nola sortu zen, nola funtzionatzen duen eta nola aukera ematen dizun liburutegi konplexuak egiteko, Hibernate ORM bezalakoak, GraalVM jatorrizko irudiekin bateragarriak izango dira.

4. Zerbitzaririk gabeko aplikazioak garatzen ikasi

Egilea: Martin Luther
Beheko bideoak Quarkus erabiliz Java aplikazio sinple bat nola sortu eta Knative-n zerbitzaririk gabeko aplikazio gisa nola zabaldu erakusten du.

5. Quarkus: Ondo pasa kodeketa

Egilea: Edson Yanaga
Zure lehen Quarkus proiektua sortzeko bideo-gida bat, Quarkus garatzaileen bihotzak zergatik irabazten ari den ulertzeko.

6. Java eta edukiontziak - zein izango den elkarrekin etorkizuna

Mark Little-k argitaratua
Aurkezpen honek Javaren historia aurkezten du eta Quarkus Javaren etorkizuna zergatik den azaltzen du.

7. Quarkus: Java Subatomiko Superfast

Egilea: Dimitris Andreadis
Garatzaileen aintzatespena jaso duten Quarkus-en abantailen ikuspegi orokorra: sinpletasuna, abiadura ultra-altuak, liburutegi eta estandar onenak.

8. Quarkus eta suziri azpiatomikoak

Egilea: Clement Escoffier
GraalVM-rekin integratzearen bidez, Quarkus-ek garapen-esperientzia ultra-azkarra eta exekuzio-denbora-ingurune subatomikoa eskaintzen ditu. Egileak Quarkus-en alde erreaktiboari buruz hitz egiten du eta nola erabili aplikazio erreaktiboak eta streaming bidez eraikitzeko.

9. Quarkus eta aplikazioen garapen azkarra Eclipse MicroProfile-n

Egilea: John Clingan
Eclipse MicroProfile eta Quarkus konbinatuz, garatzaileek hamar milisegundotan abiarazten duten edukiontzidun MicroProfile aplikazio osoak sor ditzakete. Bideoa Kubernetes plataforman inplementatzeko edukiontzidun MicroProfile aplikazio bat nola kodetu behar den xehetasunetan sartzen da.

10. Java, "Turbo" bertsioa

Egilea: Marcus Biel
Egileak Quarkus nola erabili erakusten du Java edukiontzi super-txikiak eta oso azkarrak sortzeko, benetako aurrerapenak ahalbidetzen dituztenak, batez ere zerbitzaririk gabeko inguruneetan.



Iturria: www.habr.com

Gehitu iruzkin berria