Tere kĂ”igile! TĂ€na on meil teine postitus meie Quarkus'i seerias â rÀÀgime tĂ€na natiivkompileerimisest.

on Java-tehnoloogiate kogum, mis on optimeeritud . Kuigi siin on veel palju teha, oleme pĂ”hjalikult töötanud mitmete aspektide kallal, sealhulgas JVM-i ja erinevate raamistikute optimeerimise. Ăks Quarkus'e silmapaistvamaid jooni, mis on arendajate seas palju huvi tekitanud, on pĂ”hjalik ja sujuv lĂ€henemine Java-koodi kompileerimisele tĂ€idetavateks failideks konkreetse operatsioonisĂŒsteemi jaoks (nn 'natiivkompileerimine'), sarnaselt C ja C++-le, kus selline kompileerimine toimub tavaliselt kogu tsĂŒkli lĂ”pus, mis koosneb kokku kogumisest, testimisest ja juurutamisest.
Ja kuigi natiivkompileerimine, nagu me allpool nĂ€itame, on oluline, tuleb mĂ€rkida, et Quarkus töötab vĂ€ga hĂ€sti ka tavalisel OpenJDK Hotspoti Java-masinal, tĂ€nu meie rakendatud jĂ”udluse parendustele kogu tehnoloogia alla. SeetĂ”ttu tuleks natiivkompileerimist kĂ€sitleda kui lisaboonust, mida saab kasutada soovi vĂ”i vajaduse korral. Tegelikult toetub Quarkus natiivsete piltide osas suurel mÀÀral OpenJDK-le. Ja arendajate poolt hĂ€sti vastu vĂ”etud arendusseisund, dev mode, vĂ”imaldab praktiliselt kohest muutuste testimist arenduskeskkonnas, tĂ€nu arenenud dĂŒnaamilise koodi tĂ€itmise vĂ”imalustele, mis on rakendatud Hotspotis. Lisaks kasutatakse natiivsete piltide loomisel GraalVM-i puhul OpenJDK klasside teeki ja HotSpot'i vĂ”imeid.
Miks on siis natiivkompileerimine vajalik, kui kĂ”ik on juba nii hĂ€sti optimeeritud? Sellele kĂŒsimusele pĂŒĂŒame allpool vastata.
Alustame ilmsest: Red Hat'il on suur kogemus JVM-i, tehnoloogiakogumite ja raamistikute optimeerimisega projekti ajal. , sealhulgas:
- Esimene pilve jaoks loodud rakenduste server, mis töötab .
- Esimene rakenduste server, mis töötab arvutites .
- Esimene rakenduste server, mis töötab .
- Mitmed projektid, mis töötavad seadmetes .
Oleme juba aastaid tegelenud Java-rakenduste kĂ€ivitamise probleemidega pilves ja piiratud ressurssidega seadmetes (loe: IoT) ning oleme Ă”ppinud JVM-ist maksimumi saavutama jĂ”udluse ja mĂ€lutasude optimeerimise osas. Nagu paljud teised, oleme juba ammu töötanud Java rakenduste natiivkompileerimisega lĂ€bi , , ja isegi ja ja oleme tĂ€iesti teadlikud sellise lĂ€henemise plussidest ja miinustest (nĂ€iteks dilemma universaalsuse "valmista ĂŒks kord â kĂ€ivita kĂ”ikjal" ning selle vahel, et kompileeritud rakendused on vĂ€iksema suurusega ja kĂ€ivitatakse kiiremini).
Miks on oluline arvestada neid plusse ja miinusi? Sest mÔnedes olukordades muutub nende suhe otsustavaks:
- NĂ€iteks serverless/haldamise ĂŒrituste keskkondades, kus reaalajas (karmis vĂ”i leebes reĆŸiimis), et olla suuteline reageerima sĂŒndmustele. Erinevalt pikaajalistest pĂŒsivatest teenustest, siin pikendab kĂŒlmkĂ€ivitamise aeg kriitiliselt vastamisaega pĂ€ringule. JVM-i kĂ€ivitamiseks kulub endiselt mĂ€rkimisvÀÀrselt aega ja kuigi teatud olukordades saab seda puhtalt riistvaraliste meetoditega lĂŒhendada, vĂ”ib erinevus ĂŒhe sekundi ja 5 millisekundi vahel olla elu ja surma kĂŒsimus. Jah, siin saab mĂ€ngida Java-masinate kuumreserveerimise loomisega (mida me nĂ€iteks tegime), ), kuid ainult see ei garanteeri piisavat JVM-id, et töötlemiseks nĂ”utavat arvu nĂ”udmiste suurenedes. Ja ökonoomsuse seisukohalt ei ole see kindlasti kĂ”ige Ă”igem valik.
- Edasi, on veel ĂŒks sageli esinev aspekt, nagu multitenantsus. Kuigi JVM on oma vĂ”imalustes jĂ”udnud operatsioonisĂŒsteemidele lĂ€hedale, ei suuda nad endiselt teha seda, millega oleme Linuxis harjunud â isoleerida protsesse. SeetĂ”ttu vĂ”ib ĂŒhe voolu rike rikkuda kogu Java-masina. Paljud pĂŒĂŒavad selle puuduse ĂŒletamiseks eraldada igale kasutajale eraldi JVM, et minimeerida rikke tagajĂ€rgi. See on ĂŒsna loogiline, kuid halvasti sobitub skaleerimisega.
- Lisaks on pilvealuste rakenduste jaoks oluline selline nĂ€itaja nagu teenuste tihedus hostil. Ăleminek , mikrosysteemid ja Kubernetes suurendavad Java-masinate arvu ĂŒhe rakenduse kohta. Seega, ĂŒhelt poolt, pakub see paindlikkust ja usaldusvÀÀrsust, kuid samal ajal suureneb ka pĂ”h mĂ€lu kulu teenuse kohta, kusjuures osa nendest kuludest ei ole alati rangelt vajalikud. Staatiliselt kompileeritud tĂ€itmisfailid saavavad siin kasu erinevatest optimeerimisetehnikatest, nagu madala taseme dead-code elimination, kus lĂ”plikku pilti lisatakse ainult need raamistikud (sealhulgas ka JDK), mida teenus tegelikult kasutab. SeetĂ”ttu aitab Quarkuse natiivne kompileerimine teenuse instantside tihedamat paigutust hostis ilma turvalisusele kahju tekitamata.
Ăkski ĂŒlaltoodud argumentidest on piisav, et mĂ”ista natiivse kompileerimise Ă”igustatust Quarkuse projektis osalejate vaatepunktist. Siiski on veel ĂŒks, mitte tehniline, kuid samuti oluline pĂ”hjus: viimastel aastatel on paljud arendajad ja arendusettevĂ”tted loobunud Java kasutamisest uute programmeerimiskeelte kasuks, arvates, et Java koos oma JVM-i, stekkide ja raamistikudega on muutunud liiga mĂ€luhimu jĂ€rgi, ĂŒlemÀÀra aeglaseks jne.
Kuid harjumus kasutada sama tööriista erinevate probleemide lahendamiseks â . MĂ”nikord on parem astuda samm tagasi ja otsida midagi muud. Ja kui Quarkus sunnib inimesi peatuma ja jĂ€rele mĂ”tlema, siis on see hea kogu Java ökosĂŒsteemi jaoks. Quarkus kehastab uuenduslikku lĂ€henemist sellele, kuidas luua efektiivsemaid rakendusi, muutes Java uutele rakenduste arhitektuuridele, nagu serverita, asjakohasemaks. Lisaks, tĂ€nu oma laiendatavusele, loodame, et Quarkusele tekib terve Java laienduste ökosĂŒsteem, mis suurendab mĂ€rkimisvÀÀrselt raamistike arvu, mis toovad natiivse kompileerimise rakenduste koostisosana automaatselt.
Allikas: habr.com
