Tere kĂ”igile! TĂ€na on meil teine postitus meie Quarkuse seeriast â rÀÀgime natiivkompileerimisest.

â see on Java-tehnoloogiakomplekt, mis on loodud . Ja kuigi siin on veel palju teha, oleme hĂ€sti töötanud paljude aspektide, sealhulgas JVM-i ja mitmete raamistikute optimeerimise kallal. Ăks Quarkuse eripĂ€ra, mis on arendajate seas suurt huvi Ă€ratanud, on terviklik ja sujuv lĂ€henemine Java-koodi muutmisele kĂ€ivitatavaks failiks kindlale operatsioonisĂŒsteemile (nn "natiivkompileerimine"), sarnaselt C ja C++-ga, kus selline kompileerimine toimub tavaliselt tsĂŒkli lĂ”pus, mis koosneb kokkupanekust, testimisest ja juurutamisest.
Kuigi natiivkompileerimine on, nagu me allpool nĂ€itame, oluline, tasub mĂ€rkida, et Quarkus töötab tĂ”eliselt hĂ€sti ka tavalises Java-masinas OpenJDK Hotspot, tĂ€nu neile jĂ”udluse parandustele, mida oleme kogu tehnoloogia virnas rakendanud. Seega tuleks natiivkompileerimist kĂ€sitleda kui tĂ€iendavat boonust, mida saab kasutada vastavalt soovile vĂ”i vajadusele. Tegelikult toetub Quarkus natiivpiltide osas suuresti OpenJDK-le. Ja tööstuse poolt hĂ€sti vastu vĂ”etud arendajatele mĂ”eldud dev mode tagab peaaegu kohese muudatuste testimise, toetudes Hotspoti arenenud dĂŒnaamilise koodi tĂ€itmise vĂ”imalustele. Lisaks kasutatakse natiivpiltide loomisel GraalVM-is OpenJDK klassiteeki ja HotSpot'i vĂ”imalusi.
Kuid miks on siis natiivkompileerimine vajalik, kui kĂ”ik on juba suurepĂ€raselt optimeeritud? Sellele kĂŒsimusele pĂŒĂŒame allpool vastata.
Alustame ilmsega: Red Hat'il on suur kogemus JVM-i, tehnoloogiakuhjade ja raamistikude optimeerimise alal projekti arengu kÀigus. , sealhulgas:
- Esimene rakendusserver pilve platvormil töötamiseks .
- Esimene rakenduste server, mis töötab arvutites .
- Esimene rakenduste server, mis töötab .
- Mitmed projektid, mis töötavad seadmetes .
Oleme aastaid tegelenud Java-rakenduste kĂ€ivitamise probleemidega pilves ja piiratud ressurssidega seadmetes (loe: IoT) ning Ă”ppinud JVM-i maksimumi vĂ€lja pigistama nii jĂ”udluse kui ka mĂ€lu optimeerimise osas. Nagu paljusid teisi, on meid kaua huvitanud Java rakenduste native kompileerimine lĂ€bi , , ja isegi ja oleme hĂ€sti teadlikud sellise lĂ€henemise plussidest ja miinustest (nĂ€iteks dilemma valiku vahel âkandu kord â jookse igal poolâ ja selle vahel, et kompileeritud rakendustel on vĂ€iksem suurus ja nad kĂ€ivituvad kiiremini).
Miks on oluline arvestada nende plusside ja miinustega? Sest teatud olukordades nende suhe muutub mÀÀravaks:
- NĂ€iteks serverless/ĂŒritustepĂ”histes keskkondades, kus reaalajas (kas ranged vĂ”i pehmed) reĆŸiimid, et kiiresti reageerida sĂŒndmustele. Erinevalt pikaajalistest pĂŒsimist teenustest, kriitiliselt suurendab siin kĂŒlmkĂ€ivitamise kestus vastuseaja pikkust. JVM-i kĂ€ivitamiseks kulub endiselt mĂ€rkimisvÀÀrselt aega ja kuigi mĂ”nel juhul on seda vĂ”imalik lĂŒheneda puhtalt riistvaratehnikate kaudu, vĂ”ib vahe ĂŒhe sekundi ja 5 millisekundi vahel olla elu ja surma kĂŒsimus. Jah, siin on vĂ”imalik katsetada Java-masinate kuumad reserveerimise loomisega (nagu me nĂ€iteks tegime OpenWhiski portimisel Knative'ile ), kuid see iseenesest ei taga piisavat JVM-ide arvu, et taluda koormuse suurendamiseks nĂ”udeid. Ja majanduslikust vaatenurgast ei pruugi see kindlasti olla kĂ”ige Ă”igem valik.
- Edasi, on veel ĂŒks sageli esile kerkiv aspekt, nagu multitenantsus. Kuigi JVM on oma vĂ”imaluste poolest jĂ”udnud lĂ€hedale operatsioonisĂŒsteemidele, ei suuda nad siiski teha seda, milleks me oleme Linuxis nii harjunud â isoleerida protsesse. Seega vĂ”ib ĂŒhe tĂ”rke ilmnemine hĂ€vitada kogu Java-masina. Paljud ĂŒritavad seda puudust ringi juhtida, eraldades iga kasutaja rakenduse jaoks eraldi JVM, et minimeerida tĂ”rgete tagajĂ€rgi. See on ĂŒsna loogiline, kuid ei sobi hĂ€sti skaleerimisega.
- Lisaks on pilvepĂ”histe rakenduste jaoks oluline selline nĂ€itaja nagu teenuste tihedus hostis. Ăleminek metoodikale , mikroteenused ja Kubernetes suurendavad Java-masinate arvu ĂŒhe rakenduse kohta. Ehkki see pakub paindlikkust ja usaldusvÀÀrsust, suureneb samuti baimĂ€lu kulu teenuse kohta, mille osa ei ole alati rangelt vajalik. Staatiliselt kompileeritud tĂ€itmisfailid vĂ”idavad siin madala taseme optimeerimistehnikaid, nagu dead-code elimination, kasutades ainult neid raamistiku osi (sealhulgas JDK), mida teenus tĂ”eliselt vajab. SeetĂ”ttu aitab Quarkuse kohandatud kompileerimine teenuste eesrindelahtede tihedamat paigutamist hostile ilma ohverdamata turvalisust.
Tegurite ĂŒlaltoodud pĂ”hjused on juba piisavad, et mĂ”ista Quarkuse projekti osalejate jaoks natiivkompileerimise mĂ”istlikkust. Siiski on veel ĂŒks, mitte tehniline, kuid samuti oluline pĂ”hjus: viimastel aastatel on paljud programmeerijad ja arendusettevĂ”tted loobunud Javast, eelistades uusi programmeerimiskeeli, arvates, et Java koos oma JVM-ide, stekkide ja raamistikega on muutunud liiga mĂ€lurikkaks, liiga aeglaseks jne.
Kuid harjumus kasutada sama tööriista erinevate ĂŒlesannete lahendamiseks â . MĂ”nikord on parem astuda samm tagasi ja otsida midagi muud. Ja kui Quarkus paneb inimesi peatuma ja mĂ”tlema, on see hea kogu Java ökosĂŒsteemi jaoks. Quarkus esindab uuenduslikku lĂ€henemist, kuidas luua efektiivsemaid rakendusi, muutes Java uutele rakenduste arhitektuuridele, nagu serverless, asjakohasemaks. Lisaks, tĂ€nu oma laiendatavusele, loodame, et Quarkus omandab terve Java laienduste ökosĂŒsteemi, mis suurendab mĂ€rkimisvÀÀrselt raamistike arvu, mis out-of-the-box toetavad natiivset kompileerimist rakenduste koostamisel.
Allikas: habr.com
