Ինչպե՞ս է Quarkus-ը միավորումImperative և Reactive ծրագրավորումը

Այս տարի մենք պլանավորում ենք լուրջ զարգացնել կոնտեյների թեմաները, Cloud-Native Java և Kubernetes. Այս թեմաների բնական շարունակությունն կլինի Quarkus ֆрейմվորկի մասին պատմությունը, որը արդեն քննվել է Habr-ում։ Այնօրվա հոդվածը վերաբերում է թեև "սուբատոմային գերարագ Java"-ի құрылվածքին, բայց ավելի շատ այն տեսահովորվումներին, որոնք Quarkus-ը բերում է Enterprise-ի մեջ:

Ինչպե՞ս է Quarkus-ը միավորումImperative և Reactive ծրագրավորումը

Java-ն և JVM-ը շարունակում են բացառապես հանրաճանաչ լինել, բայց առանցսերվերային տեխնոլոգիաների և ամպակալված միկրոկառույցների հետ աշխատանքում Java-ն և մյուս լեզուները, որոնք օգտագործում են JVM,越来越 редкостная применяется, так как они занимают слишком много места в памяти и слишком медленно загружаются, из-за чего плохо подходят для использования с короткоживущими контейнерами. Хорошая новость заключается в том, что в настоящее время эта ситуация начинает меняться благодаря Quarkus.

Сверхбыстрая субатомная Java вышла на новый уровень!

42 релиза, 8 месяцев работы сообщества и 177 потрясающих разработчиков – итогом всего это стал выпуск в ноябре 2019 года Quarkus 1.0, релиза, который знаменует собой важную веху в развитии проекта и предлагает массу классных функций и возможностей (подробнее о них можно прочитать в анонсе).

Այսօր մենք կպատմենք, թե ինչպես Quarkus-ը միավորում էImperative և Reactive ծրագրավորման մոդելները միակReactive միջուկի հիման վրա։ Մենք կսկսենք կարճ պատմական ակնարկից, իսկ հետո մանրամասն կքննարկենք, թե որտեղ է Quarkus-իReactive միջուկի երկակիությունը և ինչպես Java-ծրագրողները կարող են օգտվել այս առավելություններից։

Միկրոկառույցներ, ալգորիթմներով կառավարվող փառահեղությունը և serverless-ֆունկցիաները այսօր, ինչպես ասում են, մեջ բարձրացում են։ վերջին ժամանակներում ամպակալված կառույցների կառուցումը դարձել է гораздо проще и доступнее, однако խնդիրները պահպանվում են՝ հատկապես Java ծրագրավորողների մոտ։ Օրինակ, serverless-ֆունկցիաների և միկրոկառույցների դեպքում կա սուր անհրաժեշտություն կրճատել մեկնարկի ժամանակը, նվազեցնել հիշողության ծախսն ու կատարել դրանց մշակումը ավելի հարմար և հաճելի։ Java-ն վերջին տարում ունեցել է մի քանի բարելավումներ, օրինակ՝ կոնտեյների համար վերազինվում էր ֆունկցիաների էրոգնոմիկան։ Բայց դեռևս դժվար էJava-ն հասցնել հոգում նորմալից հեռացման, քանի որ այսօր միկրոկառույցները պահանջում են տարբեր խնդիրները։

Սկսելու համար անդրադառնանք պատմությանը։

Ինչպե՞ս է Quarkus-ը միավորումImperative և Reactive ծրագրավորումը

Կարիերային և կոնտեյներների

8u131 տարբերակից սկսած, Java-ն ավելի ու ավելի սկսեց աջակցել կոնտեյներին՝ բարելավված գործառույթների շնորհիվ: Մասնավորապես, այժմ JVM-ը գիտի, թե որ Prozessor չափերի վրա է աշխատում, և կարող է համապատասխանաբար կարգավորել թիթեղների խմբեր - սովորաբար, fork/join խմբերը: Անշուշտ, դա հրաշալի է, բայց ասենք, որ մենք ունենք ավանդական վեբ կիրառություն, որը օգտագործում է HTTP սերվլետներ և գործարկվում է Tomcat-ում, Jetty-ում և նմաններում: Արդյունքում, այս կիրառումը յուրաքանչյուր հարցման համար տրամադրել է առանձնակի թիթեղ, և թույլ է տալիս նրան արգելափակվել այդ թիթեղում, երբ սպասում է մուտքային-արտաքին գործողություններին, օրինակ, տվյալների բազային, ֆայլերի կամ այլ ծառայությունների դիմելու ժամանակ: Այսինքն, այդպիսի կիրառման չափսերը չեն կախված մատչելի միջուկների թվից, այլ զուգահեռ հարցումների թվից: Բացի այդ, դա նշանակում է, որ Kubernetes-ում միջուկների քանակի քվոտաները կամ սահմանափակումները այստեղ չկան առանձնապես օգտակար, և ամեն դեպքում արդյունքում կհանդիպենք տրոտինգի:

Հանձնված հիշողություն

Թիթեղները՝ սա հիշողություն է: Եվ ներսի կոնտեյներների վրա հիշողության սահմանափակումները իրական պանացի չէին: Սկսեք ավելացնել կիրառությունների և թիթեղների թիվը, և շուտով դուք կհանդիպեք անգնահատելի հաճախականության փոփոխությունների աճի, և հետևաբար՝ կատարողականության նվազման: Բացի այդ, եթե կիրառությունը օգտագործում է ավանդական միկրոսերվիսային շրջանակներ կամ կապվում է տվյալների բազայի հետ, կամ ներգրավում է հիշողության կոշտացումը, կամ և ուրիշ ձևերով բացառում է հիշողությունը, ձեզ լիովին ակնհայտ է, որ ձեզ անհրաժեշտ է գործիք, որը թույլ է տալիս ներթափանցել JVM-ի մեջ և տեսնել, թե ինչպես է այն ղեկավարվում հիշողությամբ, և չի թույլատրում միսսել նույն JVM-ը (օրինակ, XX:+UseCGroupMemoryLimitForHeap): Եվ նույնիսկ malgré որ, սկսած Java 9-ից, JVM-ն սովորել է ճանաչել Cgroups և ի համապատասխանությամբ ադապտացվել, հիշողության պահպանումը և կառավարման գործընթացը մնում է բավականին բարդ խնդիր:

Քվոտաներ և սահմանափակումներ

Java 11-ում հայտնվեց CPU քվոտաների աջակցություն (օրինակ, PreferContainerQuotaForCPUCount): Kubernetes-ն այդպես էլ առաջարկում է սահմանափակումների և քվոտաների աջակցություն: Այո, սա ամեն ինչ ունի իմաստ, բայց, եթե կիրառությունն իսկապես դուրս է գալիս հաստատված քվոտանից, մենք կրկին վերադառնալու ենք այն, որ չափը՝ ինչպես ավանդական Java կիրառությունների դեպքում, որոշվում է միջուկների թվով և առանձնակի թիթեղ տրամադրելու համար յուրաքանչյուր հարցման համար, այսինքն՝ դրանից շատ քիչ օգուտ կա:
Ալավ դե, եթե օգտագործել սահմանափակումներ և քվոտաներ կամ հորիզոնական (scale-out) սանդղակի ֆունկցիաներ, որոնք գտնվում են Kubernetes-ի հիմքում, խնդիրը նույնպես ինքնաբերաբար չի լուծվում: Մենք պարզապես ծախսում ենք ավելի շատ ռեսուրսներ սկզբնական խնդրի լուծման վրա կամ ի վերջո հանդիպում ենք ռեսուրսների չծախսման խնդրին: Իսկ եթե դա բարձր լարման համակարգ է՝ հանրային հասանելի ամպի միջավայրում, մենք գրեթե վստահ ենք սկսում օգտագործել ավելի շատ ռեսուրսներ, քան դա իսկապես անհրաժեշտ է:

Ի՞նչ պետք է անենք դրա հետ:

Միջինում ասած, պետք է օգտագործել ասինխրոն և небլոկирող մուտքի-գնման գրադարանը և Netty տեսակի ֆрейմվարկներ, Vert.x կամ Akka։ Դրանք շատ ավելի լավ են հարմարեցված կոնտեյներների մեջ աշխատելու համար իրենց ռեակտիվ բնույթի շնորհիվ։ Այդ շնորհիվ, միեւնույն սեղմումը կարող է միաժամանակ մշակել մի քանի խնդրանքներ։ Ցանկացած պահի, երբ մեկ խնդրանքը սպասում է մուտքի-գնման արդյունքների, մասնորոշող սեղմումը ազատվում է և վերցնում է մեկ այլ խնդրանք։ Իսկ երբ մուտքի-գնման արդյունքները վերջապես հասնում են, առաջին խնդրանքի մշակումն է շարունակվում։ Միեւնույն սեղմման շրջանակներում հարցումների մշակումը հերթափոխելով, կարող եք կրճատել ընդհանուր սեղմումների թիվը և նվազեցնել ռեսուրսների ծախսը հարցումների մշակման համար։

Նեխրանիս մուտքի-գնմանը, միջուկների թիվը դառնում է հիմնական պարամետր, քանի որ հենց դա որոշում է մուտքի-գնման սեղմումների թիվը, որոնք կարող են միաժամանակ իրականացվել։ Правильн օգտագործմամբ դա թույլ է տալիս արդյունավետ տարածել բեռը միջուկների միջև և արդյունավետ կերպով զբաղվել ավելի բարձր բեռներով ավելի քիչ ռեսուրսներով։

Ինչ, և դա ամենը՞։

Ոչ,还有一点值得提及。 Реактив программирование помогает лучше использовать ресурсы, но оно тоже имеет свою цену։ Переписывать код придется в соответствии с принципами неблокируемости и избегать блокировки потоков ввода-вывода։ Это совершенно другая модель разработки и выполнения։ И хотя здесь есть масса полезных библиотек, это все равно кардинальная смена привычного способа мышления։

Առաջին հերթին, դուք պետք է սովորեք գրել կարագ, որը շահագործվում է асинխրոն։ Երբ սկսում եք օգտագործել неблокирующий մուտք-հանում, դուք պետք է բացահայտորեն որոշեք, թե ինչ տեղի կունենա հարցման պատասխան ստանալու ժամանակ։ Просто բլոկավորելը և սպասելը այլևս չի կարող լինել։ Դրա փոխարեն դուք կարող եք փոխանցել հակադարձումներ, օգտագործել ռեակտիվ ծրագրավորում կամ շարունակություն։ Բայց սա դեռ ամենը չէ։ Неблокирующий մուտք-հանումն աշխատելու համար ձեզ հարկավոր են նաև неблокирующие сервեր և հաճախորդներ, և ցանկալի է հիմնական առարկաներում։ HTTP-ի դեպքում ամեն ինչ պարզ է, բայց կան նաև базы данных, ֆայլային համակարգեր և շատ ավելին։

Նաև, ամբողջական ռեակտիվությունը տալիս է առավելագույն արդյունավետություն, սակայն այս փոփոխությունը սովորաբար դժվար է իրականացնել պրակտիկայում։ Այդ պատճառով ռեակտիվ և իմպերատիվ ծածկագրերի համադրելու հնարավորությունը դառնում է անհրաժեշտ պայման։

  1. Արդյունավետ օգտագործել ռեսուրսները համակարգային ծրագրական համակարգի առավել ծանր բեռնման ուղղություններով։
  2. Օգտագործել ավելի պարզ ոճով կարագի մնացած մասերում։

Մեր ուշադրության կենտրոնում Quarkus

Իհարկե, դա Quarkus-ի սիրտն է՝ միացնել ռեակտիվ և իմպերատիվ մոդելները միեւնույն կատարողական միջավայրում։

Quarkus-ն հիմնված է Vert.x և Netty- ի վրա, որոնց վերևում օգտագործվում են մի շարք ռեակտիվ ֆрейմվորկներ և ընդլայնումներ, որոնք նախատեսված են աջակցելու ծրագրավորողներին: Quarkus-ը նախատեսված է կառուցելու ոչ միայն HTTP-միկրոհบริการներ, այլ նաև իրադարձություններով կառավարվող ճարտարապետություններ: Իր ռեակտիվ բնույթի շնորհիվ, այն շատ արդյունավետ աշխատում է հաղորդագրությունների փոխանակման համակարգերի հետ (Apache Kafka, AMQP և այլն):

Բոլորը հավակնությունները նրանում են, թե ինչպես օգտագործել նույն ռեակտիվ շարժիչը ինչպես իմպերատիվ, այնպես էլ ռեակտիվ կոդի համար:

Ինչպե՞ս է Quarkus-ը միավորումImperative և Reactive ծրագրավորումը

Quarkus-ն այս հարցում հրաշալի է: Ընտրանքն between իմպերատիվ և ռեակտիվ է ակնհայտ՝ օգտագործել և՛ դրա համար, և՛ մյուսի համար ռեակտիվ միջուկ: Եվ այն, ինչում այն շատ օգնում է, դա արագ չբլոկող կոդի ունենալն է, որը մշակել է כמעט ամեն ինչ, ինչ անցնում է իրադարձության ցիկլի թելով (event-loop thread կամ IO thread): Բայց եթե դուք ունեք դասական REST հավելվածներ կամ հաճախորդի կողմի հավելվածներ, Quarkus-ն պատրաստել է իմպերատիվ ծրագրավորման մոդել: Օրինակ, Quarkus-ում HTTP աջակցությունը կառուցված է չբլոկող և ռեակտիվ շարժիչի (Eclipse Vert.x և Netty) վրա: Ձեր հավելվածին ստացվող բոլոր HTTP հարցումները սկզբում անցնում են իրադարձության ցիկլի (IO Thread) միջոցով, ապա ուղարկվում են հարցումները կառավարող կոդի այն մասին: Գտնելով, թե ուր է ուղարկվում, հարցումների կառավարման կոդը կարող է կանչվել առանձին թի, կամ օգտագործել սկզբնական մուտքային-հաղորդագրության թելը (ռեակտիվ երթուղի):

Ինչպե՞ս է Quarkus-ը միավորումImperative և Reactive ծրագրավորումը

Հաղորդիչի համակարգերի քարոզորդների համար օգտագործվում են չբլոկող հաճախորդներ, որոնք աշխատում են Vert.x շարժիչի վրա: Այստեղից դուք կարող եք արդյունավետորեն ուղարկել, ստանալ և մշակել հաղորդագրություններ հաղորդագրությունների միջակայքի համակարգերից:

אתרում Quarkus.io կուտակվել են մի քանի լավ ուղեցույցներ, որոնք կօգնեն սկսել աշխատել Quarkus-ի հետ՝

Բացի այս, մենք պատրաստել ենք առցանց գործնական դասեր՝ աշխատանքի բերումով ռեակտիվ ծրագրավորման բազմաթիվ ասպեկտների հետ, և դրանց անցնելու համար հարկավոր է միայն բրաուзер, իսկ IDE-ի կարիքը չկա՝ նաև համակարգիչ նույնպես պարտադիր չէ: Հետաքրքրական դասերը կարող եք գտնել այստեղ.

Հեշտ առանձին ռեսուրսներ

10 վիդեոդասեր Quarkus-ի մասին, որպեսզի թեմային ծանոթանանք

Ինչպես նշում են կայքում Quarkus.io, Quarkus նա Kubernetes-հիմնավորված Java ստեք, ձևավորված GraalVM և OpenJDK HotSpot-ի համար և կազմված լավագույն Java-գրադարաններից և ստանդարտներից:

Օգնելու համար ձեզ հասկանալ այս թեման, մենք ընտրել ենք 10 վիդեոդասեր, որտեղ անդրադարձվում են Quarkus-ի տարբեր ասպեկտներին ու նրա օգտագործման օրինակներին:

1. Quarkus-ը ներկայացնում է. Java-ի հաջորդ սերունդը Kubernetes-ի համար

Ա Autoren: Թոմաս Քվօհանստրոմ (Thomas Qvarnstrom) և Ջեյսոն Գրինը (Jason Greene)
Quarkus նախագծի նպատակը Java պլատֆորմ ստեղծելն է Kubernetes և serverless միջավայրերի համար, եւ միացնել ռեակտիվ և ներխուժողական ծրագրավորման մոդելները մեկ կատարողական միջավայրի շրջանակներում, որպեսզի մշակողները կարողանան հայեցակարգերը ճկունորեն փոփոխել՝ աշխատելով բաշխված ծրագրային ճարտարապետության լայն շրջանակի վրա։ Ավելին իմանալու համար տեսեք ներածական դասախոսությունը ստորև։

Խաղալ տեսանյութը

2. Quarkus: 超快的子原子 Java

Author: Բյուլ Սաթեր (Burr Sutter)
DevNation Live-ի առցանց դասախոսության ուսուցողական տեսանյութը ցույց է տալիս, թե ինչպես Quarkus-ը օգտագործել՝ օպտիմալացնելու Enterprise Java ծրագրերը, API-ները, միկրոհիմնոգործիչները և serverless функций Երկրորդական Kubernetes/OpenShift., երբ դրանք շատ ավելի փոքր, արագացնում են և մասշտաբելի են։

Խաղալ տեսանյութը

3. Quarkus և GraalVM: 速度提升和子原子大小的 Hibernate

Author: Սանե Գրինվորո (Sanne Grinovero)
Այս ներկայացման մեջ դուք կիմանաք, թե ինչպես Quarkus-ը առաջացել է, ինչպես է այն աշխատում և ինչպես թույլ է տալիս համատեղել կոմպլեքս գրադարանները, ինչպիսիք են Hibernate ORM, GraalVM-ի նատիվ պատճենների հետ։

Խաղալ տեսանյութը

4. Ճանաչում ենք serverless ծրագրերի մշակումը

Author: Մարտին Լյութեր (Marthen Luther)
Ներքևի տեսանյութը ցույց է տալիս, թե ինչպես ստեղծել պարզ Java ծրագիր Quarkus-ի միջոցով և տեղադրել այն Knative-ի պարագայում որպես serverless ծրագիր։

Խաղալ տեսանյութը

5. Quarkus: Հաճույքով կոդավորեք

Author: Էդսոն Յանագա (Edson Yanaga)
Quarkus-ի միջոցով ձեր առաջին նախագծի ստեղծման օգտակար ուղեցույցը, որը թույլ է տալիս հասկանալ, թե ինչու Quarkus-ը գրավում է մշակողների սրտերը։

Խաղալ տեսանյութը

6. Java եւ կոնտեյներները – ինչպիսին կլինի նրանց համատեղ ապագան

Author: Մարկ Լիտտլ (Mark Little)
Այս ներկայացումը ներկայացնում է Java-ի պատմությունն ու բացատրում, թե ինչու Quarkus-ը Java-ի ապագան է։

Խաղալ տեսանյութը

7. Quarkus: 超快的子原子 Java

Author: Դիմիտրիս Ադրեանդիս (Dimitris Andreadis)
Quarkus-ի առավելությունների ակնարկ, որոնք գնահատվել են մշակողների կողմից. հեշտություն, բարձր արագություններ, լավագույն գրադարաններ և ստանդարտներ։

Խաղալ տեսանյութը

8. Quarkus և子原子反应系统

Author: Կլեմանձ Էսքոֆիեր (Clement Escoffier)
GraalVM-ի միաձուլման շնորհիվ Quarkus-ը ապահովում է unglaublicաչուն և子原子ական կատարողական միջավայր։ Պատասխանատուն խոսում է Quarkus-ի ռեակտիվ կողմի մասին և թե ինչպես օգտվել այն՝ ռեակտիվ ծրագրերի և տվյալների հոսքերի ընթացքում։

Խաղալ տեսանյութը

9. Quarkus և առաջարկների արագ մշակումը Eclipse MicroProfile-ում

Author: Ջոն Կլինկան (John Clingan)
Eclipse MicroProfile-ի և Quarkus-ի միավորարման շնորհիվ մշակողները կարող են ստեղծել լիարժեք կոնտեյներային MicroProfile ծրագրեր, որոնք գործարկվում են մի քանի ամիս։ Այս տեսանյութում մանրամասն խոսվում է, թե ինչպես կոդավորել կոնտեյներային MicroProfile ծրագիրը՝ Kubernetes-ի վրա տեղադրելու համար։

Խաղալ տեսանյութը

10. Java, «Turbo» տարբերակը

Author: Մարկուս Բիլ (Marcus Biel)
Հեղինակը ցույց է տալիս, թե ինչպես օգտագործել Quarkus՝ իրական նպատակի համար ստեղծելու տեհռիփի փոքրիկ և արագ Java կոնտեյներ, որոնք իսկապես փոխաբերուժ կարող են մտնել, հատկապես serverless միջավայրերում:

Խաղալ տեսանյութը


Ընտանիք: habr.com
Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster