Sel aastal plaanime tĂ”siselt arendada konteinerite teemasid, ja . Loomulik jĂ€tk neile on rÀÀkida raamistikust Quarkus, mis on juba Habr's. TĂ€nane artikkel ei kĂ€sitle niivĂ”rd "alateemalist superkiiret Java" ĂŒlesehitust, vaid pigem vĂ”imalusi, mida Quarkus toob ettevĂ”tte arendusse.

Java ja JVM on endiselt ĂŒlimalt populaarsed, kuid serverita tehnoloogiate ja pilvepĂ”histe mikroteenuste kasutamisel rakendatakse Java-d ja teisi JVM-i keeli jĂ€rjest harvemini, kuna need vĂ”tavad liiga palju mĂ€lu ja laadivad liiga aeglaselt, mistĂ”ttu ei sobi need hĂ€sti lĂŒhiealiste konteineritega töötamiseks. Ănneks on see olukord praegu muutumas Quarkuse tĂ€nu.
Superkiire alateemaline Java on jÔudnud uuele tasemele!
42 vĂ€ljalaskmist, 8 kuu töö kogukonnalt ja 177 hĂ€mmastavat arendajat â selle kĂ”ik on tulemuseks novembris 2019 vĂ€ljaanne , vĂ€ljalase, mis tĂ€histab olulist verstaposti projekti arengus ja pakub hulgaliselt suurepĂ€raseid funktsioone ja vĂ”imalusi (rohkem neist saab lugeda ).
TĂ€na rÀÀgime, kuidas Quarkus ĂŒhendab imperatiivsete ja reageerivate programmeerimismudelite alusel ĂŒhtset reaktiivset tuuma. Alustame lĂŒhikese ajaloo ĂŒlevaatega ja seejĂ€rel vaatame ĂŒksikasjalikult, mis seisneb Quarkuse reaktiivse tuuma dualismis ja kuidas -arendajad saavad neid eeliseid kasutada.
, ja -funktsioonid â kĂ”ik see on tĂ€napĂ€eval, nagu öeldakse, tĂ”usuteel. Hiljuti on pilvepĂ”histe arhitektuuride loomine muutunud oluliselt lihtsamaks ja kĂ€ttesaadavamaks, kuid probleemid on jÀÀnud â eriti Java-arendajatele. NĂ€iteks serverless-funktsioonide ja mikroteenuste puhul on ÀÀrmiselt vajalik kĂ€ivitusaega lĂŒhendada, mĂ€lu tarbimist vĂ€hendada ja muuta nende arendamine mugavamaks ja meeldivamaks. Java on viimastel aastatel teinud mitmeid tĂ€iustusi, nagu konteineritele mĂ”eldud funktsionaalsuse tĂ€iustamine ning muud. Siiski on Java tĂ”rgete vĂ€ltimine konteineris endiselt keeruline. SeetĂ”ttu alustame sellest, et vaatame mĂ”ningaid Java sisemisi keerukusi, mis eriti teravalt esinevad konteineripĂ”histe Java-rakenduste arendamisel.
Alustuseks vaatame ajalugu.

SĂŒsteemid ja konteinerid
Alates versioonist 8u131 on Java rohkem-vĂ€hem hakanud konteinerite jaoks toimetama, tĂ€nu ergonomika funktsionaalsuse tĂ€iustamisele. Eriti teab JVM nĂŒĂŒd, mitu protsessorituuma see töötab, ja suudab vastavalt konfigureerida töövoogude gruppe â tavaliselt fork/join gruppe. See on loomulikult suurepĂ€rane, kuid oletame, et meil on traditsiooniline veebirakendus, mis kasutab HTTP-serve ja töötab Tomcatis, Jettyâs jne. Tulemuseks on see, et rakendus jagab iga pĂ€ringu jaoks eraldi töövoo ja vĂ”imaldab sellel voolul blokeerida, oodates sisendi-vĂ€ljundi operatsioone, nĂ€iteks kĂ”nes andmebaasiga, failidega vĂ”i muude teenustega. See tĂ€hendab, et sellise rakenduse suurus ei sĂ”ltu saadaval olevate tuumade arvust, vaid samal ajal tehtavate pĂ€ringute arvust. Lisaks tĂ€hendab see, et Kubernetes'i tuumade arvu kvoodid vĂ”i piirangud ei aita siinkohal palju ning lĂ”ppkokkuvĂ”ttes viib see troppimise juurde.
MĂ€lu ammendumine
Voolud on mĂ€lu. Ja konteinerite piirmÀÀrad ei ole sugugi kĂ”ikvĂ”imsad. Alustage lihtsalt rakenduste ja voogude arvu suurendamist, ja varem vĂ”i hiljem seotud olete silmitsi kriitilise konksude vahetuse kasvu ja seega sooritusvĂ”ime halvenemisega. Lisaks, kui rakendus kasutab traditsioonilisi mikroteenuste raamistikke vĂ”i on ĂŒhendatud andmebaasidega, vĂ”i rakendab vahemĂ€lu, vĂ”i kuidagi muul viisil kasutab mĂ€lu, vajate kindlasti tööriista, mis vĂ”imaldab vaadata JVM-i sisse ja nĂ€ha, kuidas see mĂ€lu haldab, samas mitte hĂ€vitades JVM-i ennast (nĂ€iteks XX:+UseCGroupMemoryLimitForHeap). Ja isegi hoolimata sellest, et alates Java 9-st on JVM Ă”ppinud cgroups'e tajuma ja vastavalt kohanduma, jÀÀb mĂ€lu eraldamine ja haldamine ĂŒsna keeruliseks asjaks.
Kvoodid ja piirangud
Java 11 on saanud toetuse CPU-kvootidele (nĂ€iteks PreferContainerQuotaForCPUCount). Kubernetes pakub samuti tugi piirangutele ja kvootidele. Jah, see kĂ”ik on mĂ”ttekas, kuid kui rakendus taas ĂŒletab mÀÀratud kvoodi, pöördume tagasi koodi, et suurus â nagu traditsiooniliste Java-rakenduste puhul â mÀÀratakse tuumade arvu ja eraldatud niidi mÀÀramise pĂ”hjal iga pĂ€ringu jaoks, seega on sellest kĂ”igest vĂ€he kasu.
Lisaks, kui kasutada kvoote ja piiranguid vĂ”i Kubernetesel pĂ”hineva platvormi horisontaalse (scale-out) skaleerimise funktsioone, ei lahenda probleem iseennast. Me lihtsalt kulutame rohkem ressursse algse probleemi lahendamiseks vĂ”i satume lĂ”puks ressursside ĂŒlekasutamisse. Ja kui see on kĂ”rge koormusega sĂŒsteem avalikus pilves, hakkame peaaegu kindlasti kasutama rohkem ressursse, kui tegelikult vajalik.
Kuidas sellega kÔigega toime tulla?
Lihtsalt öeldes, tuleks kasutada asĂŒnkroonseid ja mitteblokeerivaid I/O teeke ja raamistikku nagu Netty, vĂ”i Akka. Need sobivad konteinerites töötamiseks palju paremini tĂ€nu oma reaktiivsele iseloomule. TĂ€nu mitteblokeerivale sisend-vĂ€ljundile vĂ”ib sama niit samal ajal kĂ€sitleda mitmeid samaaegseid pĂ€ringuid. Samal ajal kui ĂŒks pĂ€ring ootab sisend-vĂ€ljundi tulemusi, vabastatakse see niit, et tegeleda teise pĂ€ringuga. Kui sisend-vĂ€ljundi tulemused lĂ”puks saabuvad, jĂ€tkatakse esimese pĂ€ringu töötlemist. Ăhe ja sama niidi raames pĂ€ringute vahelduv töötlemine vĂ”imaldab vĂ€hendada niitide koguarvu ja vĂ€hendada ressursikasutust pĂ€ringute töötlemisel.
Mitteblokeeriva sisend-vĂ€ljundi korral on tuumade arv kriitiline parameeter, kuna just see mÀÀrab, kui palju sisend-vĂ€ljundi niite saab samaaegselt kĂ€itada. Ăige kasutuse korral vĂ”imaldab see tĂ”husalt jaotada koormust tuumade vahel ning toime tulla suuremate koormustega vĂ€iksema ressursikasutusega.
Kuidas, ja see kÔik?
Ei, siin on veel midagi. Reaktiivne programmeerimine aitab paremini kasutada ressursse, kuid see toob ka oma hinda. EelkĂ”ige tuleb kood ĂŒmber kirjutada vastavalt blokeerimise vĂ€ltimise pĂ”himĂ”tetele ja vĂ€ltida sisendi-vĂ€ljundi voogude blokkeerimist. See on hoopis teine arenduse ja tĂ€itmise mudel. Ja kuigi siin on palju kasulikke raamatukogusid, on see ikkagi radikaalne muutus harjumuspĂ€rases mĂ”tteviisis.
Esiteks peate Ă”ppima kirjutama koodi, mis tĂ€idetakse asĂŒnkroonselt. Nagu ainult te hakkate kasutama mitteblokeerivat sisendi-vĂ€ljundit, peate selgelt mÀÀrama, mis juhtub, kui vastus saabub. Lihtsalt blokeerida ja oodata enam ei Ă”nnestu. Selle asemel saate edastada tagasikutsumisi, kasutada reaktiivset programmeerimist vĂ”i jĂ€tkufunktsioone. Kuid see ei ole veel kĂ”ik: mitteblokeeriva sisendi-vĂ€ljundi kasutamiseks vajate mitteblokeerivaid servereid ja kliente, ja soovitavalt igal pool. HTTP puhul on kĂ”ik lihtne, kuid on veel andmebaasid, failisĂŒsteemid ja palju muud.
Kuigi totaalne reaktiivne lĂ€henemine pakub maksimumtĂ”husust, on sellise ĂŒlemineku praktikas rakendamine sageli keeruline. SeetĂ”ttu on vajalik ĂŒhendama reaktiivne ja imperatiivne kood, et:
- TĂ”husalt kasutada ressursse kĂ”ige koormatumates tarkvarasĂŒsteemi suundades;
- Kasutada lihtsamat stiili koodi ĂŒlejÀÀnud osades.
Tutvustame Quarkust
Selles peitubki Quarkuse olemus â ĂŒhendada reaktiivne ja imperatiivne mudel ĂŒhe tĂ€ideviimise keskkonna raames.
Quarkuse aluseks on Vert.x ja Netty, millele rajatakse hulk reaktiivseid raamistikke ja laiendusi, et aidata arendajat. Quarkus on mĂ”eldud mitte ainult HTTP-mikroteenuste, vaid ka sĂŒndmustega juhitud arhitektuuride ehitamiseks. TĂ€nu oma reaktiivsele loomusele töötab see vĂ€ga tĂ”husalt sĂ”numite saatmise sĂŒsteemidega (Apache Kafka, AMQP jne).
KÔik ongi selles, kuidas kasutada sama reaktiivset mootort nii imperatiivse kui ka reaktiivse koodi jaoks.

Quarkus teeb sellega suurepĂ€rase töö. Valik imperatiivse ja reaktiivse vahel on ilmne â kasutada reaktiivset tuuma nii ĂŒhe kui teise jaoks. See aitab eriti kiiresti ja mitteblokeerivat koodi luua, mis kĂ€itleb peaaegu kĂ”ike, mis lĂ€bib sĂŒndmuste tsĂŒkli (event-loop thread, tuntud ka kui IO thread). Kuid kui teil on klassikalised REST-rakendused vĂ”i kliendi poolel töötavad rakendused, on Quarkusel olemas imperatiivne programmeerimismudel. NĂ€iteks HTTP toetus Quarkuses pĂ”hineb mitteblokeeriva ja reaktiivse mootori (Eclipse Vert.x ja Netty) kasutamisel. KĂ”ik HTTP-pĂ€ringud, mis teie rakendusse jĂ”uavad, lĂ€bivad esmalt sĂŒndmuste tsĂŒkli (IO Thread) ja edastatakse seejĂ€rel koodiosasse, mis haldab pĂ€ringuid. SĂ”ltuvalt sihtkohast vĂ”ib pĂ€ringute haldamise kood kĂ€ivituda eraldi lĂ”imes (nn worker thread, rakendatakse servletide ja Jax-RS puhul) vĂ”i kasutada originaal sisse-/vĂ€ljalaske voogu (reaktiivne marsruut reactive route).

SĂŒndmustesĂŒsteemide ĂŒhendamiseks kasutatakse mittesĂŒnkroneeritud kliente, mis töötavad Vert.x mootori peal. SeetĂ”ttu saate tĂ”husalt saata, vastu vĂ”tta ja töödelda sĂ”numeid sĂ”numivahetuse vahekihiga seotud sĂŒsteemidest.
Lehelt oleme kogunud mitmeid hÀid juhendeid, et aidata teil Quarkustega alustada:
Lisaks oleme ette valmistanud veebipÔhised praktilised Ôpikursused, et tutvustada erinevaid reaktiivse programmeerimise aspekte. Nende lÀbimiseks piisab vaid brauserist, ei ole vajalik IDE-d ning arvuti pole ka hÀdavajalik. Need Ôpikursused on saadaval .
Kasulikud ressursid
- Quarkuse projekti veebisait â
- Quarkuse projekt GitHubis â
- Quarkuse projekti Twitteri konto â
- Quarkuse projekti vestlus â
- Quarkuse projekti foorumid â !forum/quarkus-dev
10 videotundi Quarkuse kohta, et teemaga tutvuda
Nagu veebisaidil öeldakse , on -orienteeritud Java-tehnoloogiate kogum, mis on optimeeritud GraalVM ja OpenJDK HotSpot jaoks ja koosneb parimatest Java teekidest ja standarditest.
Kuna aidata teil Quarkuse teemat mÔista, oleme valinud 10 videoÔpetust, kus kÀsitletakse erinevaid aspekte ja nÀiteid Quarkuse kasutamisest:
1. Tutvustame Quarkust: uus pÔlvkond Java raamistik Kubernetes'ele
Autorid: Thomas Qvarnstrom ja Jason Greene
Quarkuse projekti eesmĂ€rk on luua Java platvorm Kubernetes'ele ja serverless keskkondadele ning kombineerida reaktiivne ja imperatiivne programmeerimismudel ĂŒhes kĂ€ituskeskkonnas, et arendajad saaksid paindlikult lĂ€heneda laiale valikule jaotatud rakenduste arhitektuuridest. Rohkem teavet leiate all olevast sissejuhatusloengust.

2. Quarkus: ĂŒlikiire subaatomi Java
Autor: Burr Sutter
VideoÔpetus interneti loengust DevNation Live demonstreerib, kuidas kasutada Quarkust ettevÔtte Java rakenduste, API-de, mikroteenuste ja serverless funktsioonide optimeerimiseks Kubernetes/OpenShift keskkonnas, muutes need palju vÀiksemaks, kiiremaks ja paremini skaleeritavaks.

3. Quarkus ja GraalVM: kiirendame Hibernate'i ĂŒlikiiruseni ja tihendame subaatomi suurustesse
Autor: Sanne Grinovero
Esitluses saate teada, kuidas Quarkus sĂŒndis, kuidas see töötab ja kuidas vĂ”imaldab keerulisi teeke, nagu Hibernate ORM, GraalVM-i native-piltidega ĂŒhilduvaks muuta.

4. Ăpime arendama serveriteta rakendusi
Autor: Marthen Luther
Allolevas videos nÀidatakse, kuidas luua lihtne Java rakendus Quarkuse abil ja kÀivitada see serveriteta rakendusena Knative'is.

5. Quarkus: programmeerige naudinguga
Autor: Edson Yanaga
Videojuhend teie esimese Quarkuse projekti loomiseks, mis aitab mĂ”ista, miks Quarkus vĂ”idab arendajate sĂŒdameid.

6. Java ja konteinerid â milline saab olema nende ĂŒhisosa tulevik
Autor: Mark Little
See esitlus tutvustab Java ajalugu ja selgitab, miks Quarkus on Java tulevik.

7. Quarkus: ĂŒlikiire subaatomarne Java
Autor: Dimitris Andreadis
Ălevaade Quarkuse eelistest, mis on arendajate seas tunnustust leidnud: lihtsus, ĂŒlivĂ”rdsed kiirus, parimad teegid ja standardid.

8. Quarkus ja subaatomised reaktiivsed sĂŒsteemid
Autor: Clement Escoffier
GraalVM integreerimise abil tagab Quarkus ĂŒlikiire arendusprotsessi ja subaatomilise jooksukeskkonna. Autor rÀÀgib Quarkuse reaktiivsest kĂŒljest ja sellest, kuidas seda kasutada reaktiivsete rakenduste ja voogedastuse rakenduste loomisel.

9. Quarkus ja kiire rakenduste arendus Eclipse MicroProfile'is
Autor: John Clingan
Kombineerides Eclipse MicroProfile'i ja Quarkuse, saavad arendajad luua tĂ€isfunktsionaalseid MicroProfile konteinerrakendusi, mis kĂ€ivitatakse mĂ”ne kĂŒmne millisekundi jooksul. Videos nĂ€idatakse ĂŒksikasjalikult, kuidas kodeerida konteinerrakendust MicroProfile'i jaoks Kuberneteses juurutamiseks.

10. Java, "Turbo" versioon
Autor: Marcus Biel
Autor nĂ€itab, kuidas kasutada Quarkust supervĂ€ikeste ja ĂŒli kiirete Java konteinerite loomiseks, mis vĂ”imaldavad saavutada tĂ”elist lĂ€bimurret, eriti serverivabades keskkondades.

Allikas: habr.com
