Sel aastal plaanime tĂ”siselt arendada konteinerite teemasid, ja . Loomulik jĂ€tk nendele teemadele on jutustamine raamistikust Quarkus, mida on juba HabrĂ©. TĂ€na on artikkel pĂŒhendatud mitte niivĂ”rd âsubatomaarse ĂŒli kiire Javaâ seadusele, kuivĂ”rd sellele, millised perspektiivid Quarkus toob Enterprise'i.

Java ja JVM on endiselt ÀÀrmiselt populaarsed, kuid serveriteta tehnoloogiate ja pilvepĂ”histe mikroteenustega töötades kasutatakse Java't ja teisi JVM-i keeli jĂ€rjest harvemini, kuna need kasutavad liiga palju mĂ€lu ja laaditakse liiga aeglaselt, mistĂ”ttu need ei sobi hĂ€sti lĂŒhiealiste konteinerite kasutamiseks. Ănneks hakkab praegune olukord tĂ€nu Quarkusele muutuma.
Ăli kiire subatomaarne Java on saavutanud uue taseme!
42 versiooni, 8 kuud kogukonna tööd ja 177 hĂ€mmastavat arendajat â selle kĂ”ikide tulemuseks oli Quarkus 1.0 vĂ€ljaandmine novembris 2019. , vĂ€ljaanne, mis tĂ€histab olulist verstaposti projekti arengus ja pakub hulgaliselt lahedaid funktsioone ja vĂ”imalusi (tĂ€iendavat teavet nende kohta saab lugeda ).
TĂ€na rÀÀgime sellest, kuidas Quarkus ĂŒhendab imperatiivse ja reaktiivse programmeerimise mudelid ĂŒhtse reaktiivse tuuma pĂ”hjal. Alustame lĂŒhikese ajalooĂŒlevaatega ja seejĂ€rel vaatame pĂ”hjalikult, kus seisneb Quarkuse reaktiivse tuuma dualism ja kuidas -arendajad saavad neist eelistest kasu.
, ja -funktsioonid â kĂ”ik see on tĂ€napĂ€eval, nagu öeldakse, tĂ”usuteel. Hiljuti on pilvepĂ”histe arhitektuuride loomine muutunud palju lihtsamaks ja kĂ€ttesaadavamaks, kuid probleemid jÀÀvad â eriti Java arendajatele. NĂ€iteks serverless-funktsioonide ja mikroteenuste puhul on ÀÀrmiselt oluline vĂ€hendada kĂ€ivitusaega, vĂ€hendada mĂ€lu kasutust ja muuta nende arendamine mugavamaks ja meeldivamaks. Java on viimastel aastatel teinud mitmeid tĂ€iustusi, sealhulgas konteinerite toetava funktsionaalsuse ergonoomikat jne. Kuid enamasti ei ole Java sujuva töö saavutamine konteineris endiselt lihtne. SeetĂ”ttu alustame mĂ”ningate Java sisemiste keerukustega, mis ilmnevad eriti teravalt konteineripĂ”histe Java rakenduste arendamisel.
Alustame ajaloost.

Voogud ja konteinerid
Alates versioonist 8u131 on Java hakanud paremini toetama konteinerite kasutust, tĂ€nu ergonomika funktsionaalsuse parendustele. EelkĂ”ige teab JVM nĂŒĂŒd, kui palju protsessori tuumasid see kasutab, ja saab vastavalt sellele kohandada lĂ”ime gruppe â enamasti fork/join gruppe. Muidugi on see suurepĂ€rane, kuid oletame, et meil on traditsiooniline veebirakendus, mis kasutab HTTP-servlette ja töötab Tomcatis, Jetty's jne. Tulemuseks on, et see rakendus eraldab igale pĂ€ringule eraldi lĂ”ime ja vĂ”imaldab tal blokeerida selle lĂ”ime sisend-vĂ€ljund operatsioonide ootel, nĂ€iteks andmebaasi, failide vĂ”i teiste teenuste kutsumisel. See tĂ€hendab, et sellise rakenduse suurus ei sĂ”ltu kĂ€ttesaadavate tuumade arvust, vaid samaaegsete pĂ€ringute arvust. Lisaks tĂ€hendab see, et Kubernetes'i tuumade arvu kvoodid vĂ”i piirangud ei aita siin eriti, ja asi lĂ”ppeb lĂ”puks throttling'uga.
MĂ€lu ammendumine
LĂ”imed on mĂ€lu. Ja konteinerite sisemised mĂ€lu piirangud ei ole kaugeltki imerohi. Alustage rakenduste ja lĂ”imede arvu suurendamist ja varem vĂ”i hiljem seisate silmitsi kriitilise klĂ”psamissageduse kasvuga, mis omakorda toob kaasa jĂ”udluse languse. Lisaks, kui rakendus kasutab traditsioonilisi mikroteenuste raamistikku vĂ”i ĂŒhendub andmebaasidega, vĂ”i kasutab cache'ingut, vĂ”i tarbib kuidagi muul moel mĂ€lu, vajate kindlasti tööriista, mis vĂ”imaldab vaadata JVM-i sisse ja nĂ€ha, kuidas ta mĂ€lu haldab, tapmata samas JVM-i (nt XX:+UseCGroupMemoryLimitForHeap). Ning kuigi alates Java 9-st on JVM Ă”ppinud tundma cgroup'e ja kohandub vastavalt, jÀÀb mĂ€lu reserveerimine ja haldamine ikka ĂŒsna keeruliseks.
Kvoodid ja piirangud
Java 11-s lisandus CPU kvootide tugi (nt PreferContainerQuotaForCPUCount). Kubernetes pakub samuti toetust piirangutele ja kvootidele. Jah, see kĂ”ik on mĂ”ttekas, kuid kui rakendus jĂ€lle ĂŒletab mÀÀratud kvooti, jĂ”uame jĂ€lle selleni, et suurus â nagu traditsiooniliste Java rakenduste puhul â mÀÀratakse tuumade arvu jĂ€rgi, eraldades igale pĂ€ringule eraldi lĂ”ime, see tĂ€hendab, et kogu sellest ei ole suurt kasu.
Lisaks, isegi kui kasutada Kubernetes'i aluseks olevat platvormi kvote ja limiite vĂ”i horisontaalse (scale-out) skaleerimise funktsioone, ei lahenda probleem iseenesest. Me lihtsalt kulutame rohkem ressursse algse probleemi lahendamiseks vĂ”i lĂ”puks jÀÀme ressursse ĂŒle. Ja kui see on kĂ”rge koormusega sĂŒsteem avalikus pilves, hakkame peaaegu kindlasti kasutama rohkem ressursse, kui tegelikult vajalik on.
Ja mida kÔigega sellega teha?
Lihtsalt öeldes, tuleks kasutada asĂŒnkroonseid ja blokeerimata sisendi-vĂ€ljundi teeke ning raamistikke nagu Netty, vĂ”i Akka. Need sobivad konteinerites töötamiseks palju paremini oma reaktiivse olemuse tĂ”ttu. Blokeerimata sisendi-vĂ€ljundi tĂ”ttu saab sama niidi töötleja korraga töödelda mitmeid samaaegseid pĂ€ringuid. Samal ajal kui ĂŒks pĂ€ring ootab sisendi-vĂ€ljundi tulemusi, vabastatakse selle töötlev niit ja asub teise pĂ€ringu juurde. Ja kui sisendi-vĂ€ljundi tulemused lĂ”puks saadakse, jĂ€tkub esimese pĂ€ringu töötlemine. Korrates pĂ€ringute töötlemist ĂŒhe ja sama niidi raames, saab vĂ€hendada ĂŒldiste niitide arvu ja vĂ€hendada pĂ€ringute töötlemise jaoks vajalike ressursside kulu.
Blokeerimata sisendi-vĂ€ljundi korral muutub protsessorite arv kriitiliseks parameetriks, kuna see mÀÀrab sisendi-vĂ€ljundi niitide arvu, mida saab samaaegselt töödelda. Ăige kasutamise korral vĂ”imaldab see tĂ”husalt jaotada koormust protsessorite vahel ja hallata suuremaid koormusi vĂ€iksema ressursikasutusega.
Kuidas, ja kas see on kÔik?
Ei, on veel midagi. Reaktiivne programmeerimine aitab paremini kasutada ressursse, kuid sellel on ka oma hind. EelkĂ”ige tuleb kood ĂŒmber kirjutada vastavalt blokeerimise vĂ€ltimise pĂ”himĂ”tetele ja vĂ€ltida sisendi-vĂ€ljundi niitide blokeerimist. Ja see on hoopis teine arendamise ja tĂ€itmise mudel. Ja kuigi seal on palju kasulikke teeke, on see ikkagi radikaalne muutus harjumuspĂ€rastest mĂ”ttemustritest.
Esiteks peate Ă”ppima kirjutama koodi, mis töötab asĂŒnkroonselt. Kui hakkate kasutama blokeerimata sisend-vĂ€ljundit, peate selgelt mÀÀrama, mis peaks toimuma vastuse saamisel pĂ€ringule. Lihtsalt blokeerida ja oodata enam ei saa. Selle asemel vĂ”ite edastada tagasiside, kasutada reaktiivprogrammeerimist vĂ”i continuation-i. Kuid see pole veel kĂ”ik: blokeerimata sisend-vĂ€ljundi kasutamiseks vajate ka blokeerimata servereid ja kliente, eelistatult igal pool. HTTP puhul on kĂ”ik lihtne, kuid on veel andmebaasid, failisĂŒsteemid ja palju muud.
Ja kuigi totaalne lÀbipaistev reaktiivsus pakub maksimaalset efektiivsust, vÔib selline muutus olla praktikas raske seedida. SeetÔttu muutub reaktiivse ja imperatiivse koodi kombineerimise vÔimalus hÀdavajalikuks, et:
- TĂ”husalt kasutada ressursse kĂ”ige koormatumates programmide sĂŒsteemides;
- Kasutada lihtsamat stiili koodi ĂŒlejÀÀnud osades.
Tutvustame Quarkust
Otsustav ongi see, et Quarkus ĂŒhendab reaktiivsed ja imperatiivsed mudelid ĂŒhes tĂ€itmiskeskkonnas.
Quarkuse aluseks on Vert.x ja Netty, mille peal on rida reaktiivseid raamistikke ja laiendusi, mis aitavad arendajal. Quarkus on mĂ”eldud mitte ainult HTTP-mikroteenuste, vaid ka sĂŒndmustega juhitud arhitektuuride loomiseks. TĂ€nu oma reaktiivsele iseloomule töötab see vĂ€ga tĂ”husalt sĂ”numite edastamise sĂŒsteemidega (Apache Kafka, AMQP jms).
KĂ”ik on hĂ”lmatud selles, kuidas kasutada ĂŒhte ja sama reaktiivset mootorit nii imperatiivse kui ka reaktiivse koodi jaoks.

Quarkus lahendab selle suurepĂ€raselt. Valik imperatiivse ja reaktiivse vahel on selge â kasutada reaktiivset tuuma nii ĂŒhe kui teise jaoks. Ja see, millega see tĂ”eliselt aitab, on kiire mitteblokeeriv kood, mis töötleb peaaegu kĂ”ike, mis lĂ€bib sĂŒndmuste tsĂŒkli (event-loop thread, tuntud ka kui IO thread). Kuid kui teil on klassikalised REST-iga rakendused vĂ”i kliendipoolseid rakendusi, on Quarkusel valmis imperatiivne programmeerimisviis. NĂ€iteks HTTP tugi 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 seejĂ€rel saadetakse koodiosale, mis haldab pĂ€ringuid. SĂ”ltuvalt sihtkohast vĂ”ib pĂ€ringute haldamise kood kĂ€ivituda eraldi lĂ”imes (nii tuntud worker thread, mis on kasutusel servletite ja Jax-RS puhul) vĂ”i kasutada algset sisend-vĂ€ljundit (reaktiivne marsruut).

SĂ”numite edastamise sĂŒsteemide konnektorite jaoks kasutatakse mitteblokeerivaid kliente, mis töötavad Vert.x mootori peal. Seega saate tĂ”husalt saata, vastu vĂ”tta ja töödelda sĂ”numeid sĂ”numite vahendusklassi sĂŒsteemidest.
Meie veebisaidil on koostatud mitu head juhendit, mis aitavad Quarkusega alustada:
Lisaks oleme ette valmistanud veebipÔhised praktilised kursused, et tutvuda reaktiivse programmeerimise erinevate aspektidega, kusjuures nende lÀbimiseks on vajalik ainult brauser, ei ole vaja IDE-d, samuti ei ole vajalik arvuti. Need kursused leiate .
Kasulikud ressursid
- Quarkuse projekti koduleht on
- Quarkuse projekt GitHubis on
- Quarkuse projekti Twitteri konto on
- Quarkuse projekti vestlus on
- Quarkuse projekti foorumid on !forum/quarkus-dev
10 videoÔpetust Quarkuse kohta teema selgitamiseks
Nagu veebilehel kirjutatakse , , which combines -orienteeritud Java-stek, mis on kohandatud GraalVM-i ja OpenJDK HotSpot-i ning koosneb parimatest Java teekidest ja standarditest.
Teema selgitamiseks oleme vÀlja valinud 10 videoÔpetust, kus kÀsitletakse Quarkuse erinevaid aspekte ning nÀidatakse selle kasutamise nÀiteid:
1. Tutvustame Quarkust: uue pÔlvkonna Java raamistik Kubernetes'e jaoks
Autorid: Thomas Qvarnstrom ja Jason Greene
Quarkus projekti eesmĂ€rk on luua Java platvorm Kubernetes ja serverless keskkondade jaoks ning ĂŒhendada reaktiivsed ja imperatiivsed programmeerimise mudelid ĂŒhes kĂ€ituskeskkonnas, et arendajad saaksid paindlikult varieerida lĂ€henemist laia valiku jaotatud rakenduste arhitektuuride puhul. Lisateavet leiate allolevast sissejuhatavast loengust.

2. Quarkus: ĂŒlikiire subaatomaarne Java
Autor: Burr Sutter
Veebiloeng DevNation Live nÀitab, kuidas kasutada Quarkust ettevÔtte Java rakenduste, API-de, mikroteenuste ja serverless funktsioonide optimeerimiseks Kubernetes/OpenShift keskkonnas, muutes need palju vÀiksemaks, kiiremaks ja skaleeritavamaks.

3. Quarkus ja GraalVM: sundime Hibernate kiireks ja surume subaatomaarsetesse mÔÔtmetesse
Autor: Sanne Grinovero
Esitluses saate teada, kuidas Quarkus tekkis, kuidas see töötab ja kuidas see muudab keerukad raamatukogud, nagu Hibernate ORM, GraalVM-i natiivpiltidega ĂŒhilduvaks.

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

5. Quarkus: kodutöödega nauditavamalt
Autor: Edson Yanaga
Samm-sammuline juhend teie esimese Quarkus projekti loomiseks, et mĂ”ista, miks Quarkus vĂ”idab arendajate sĂŒdamed.

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

7. Quarkus: ĂŒlikiire subaatomaarne Java
Autor: Dimitris Andreadis
Ălevaade Quarkuse eelistest, mis on arendajate seas tunnustatud: lihtsus, ĂŒlim kiirus, parimad raamatukogud ja standardid.

8. Quarkus ja subaatomaarne reaktiivne sĂŒsteem
Autor: Clement Escoffier
GraalVM-i integreerimise tĂ”ttu pakub Quarkus ĂŒlimalt kiiret arenduskogemust ja subaatomaarset kĂ€ituskeskkonda. Autor rÀÀgib Quarkuse reaktiivsest poolest ja sellest, kuidas seda kasutada reaktiivsete rakenduste ja andmevoogude rakenduste loomisel.

9. Quarkus ja rakenduste kiire arendamine Eclipse MicroProfile'is
Autor: John Clingan
Kombineerides Eclipse MicroProfile'i ja Quarkuse, saavad arendajad luua tĂ€isfunktsionaalseid MicroProfile konteinerirakendusi, mis kĂ€ivituvad vaid mĂ”ne kĂŒmne millisekundi jooksul. Videos kĂ€sitletakse ĂŒksikasjalikult, kuidas kodeerida MicroProfile konteinerirakendust Kubernetes platvormile juurutamiseks.

10. Java, versioon "Turbo"
Autor: Markus Biel
Autor nÀitab, kuidas kasutada Quarkust supervÀikeste ja superkiirete Java konteinerite loomiseks, mis vÔimaldavad tÔelist lÀbimurret, eriti serverless keskkondades.

Allikas: habr.com
