Quarkus императивті және реактивті бағдарламалауды қалай біріктіреді

Осы жылы біз контейнерлік тақырыптарды байыпты дамытуды жоспарлап отырмыз, Cloud-Native Java и Kubernetes. Бұл тақырыптардың логикалық жалғасы қазірдің өзінде Кваркус шеңбері туралы әңгіме болады қарастырылады Хабреде. Бүгінгі мақалада «субатомдық өте жылдам Java» дизайны туралы азырақ және Кваркустың Enterprise-ге беретін уәдесі туралы көбірек.

Quarkus императивті және реактивті бағдарламалауды қалай біріктіреді

Java және JVM әлі де өте танымал, бірақ серверсіз технологиялармен және бұлттық микросервистермен жұмыс істегенде, Java және басқа JVM тілдері азырақ пайдаланылады, өйткені олар жадта тым көп орын алады және оларды жүктеу өте баяу, сондықтан оларды жасайды. қысқа мерзімді контейнерлермен пайдалану үшін нашар қолайлы. Бақытымызға орай, бұл жағдай Кваркустың арқасында өзгере бастады.

Өте жылдам субатомдық Java жаңа деңгейге жетті!

42 шығарылым, 8 айлық қоғамдық жұмыс және 177 таңғажайып әзірлеушілер - барлығының нәтижесі 2019 жылдың қарашасында шығарылым болды. Кваркус 1.0, жобаның дамуындағы маңызды кезеңді белгілейтін және көптеген керемет мүмкіндіктер мен мүмкіндіктерді ұсынатын шығарылым (олар туралы толығырақ мына жерден оқи аласыз. хабарландыру).

Бүгін біз сізге Quarkus императивті және реактивті бағдарламалау үлгілерін бір реактивті ядроға қалай біріктіретінін көрсетеміз. Біз қысқаша тарихтан бастайық, содан кейін Кваркустың реактивті негізгі дуализмі не екенін және қалай болатынын егжей-тегжейлі қарастырамыз. Java- Әзірлеушілер бұл артықшылықтарды пайдалана алады.

Микросервис, оқиғаға негізделген архитектуралар и серверсіз-функциялар – мұның бәрі, олар айтқандай, бүгінгі күні өркендеу үстінде. Жақында бұлтқа негізделген архитектураларды жасау әлдеқайда оңай және қол жетімді болды, бірақ проблемалар әлі де сақталуда - әсіресе Java әзірлеушілері үшін. Мысалы, серверсіз функциялар мен микросервистер жағдайында іске қосу уақытын қысқарту, жадты тұтынуды азайту және әлі де олардың дамуын ыңғайлы және жағымды ету қажет. Java соңғы жылдары бірнеше жақсартулар жасады, мысалы, контейнерлер үшін жақсартылған эргономика функционалдығы және т.б. Дегенмен, Java-ның контейнерде дұрыс жұмыс істеуі әлі де қиын. Сонымен, біз Java тіліне тән кейбір күрделіліктерді қарастырудан бастаймыз, олар әсіресе контейнерге бағытталған Java қолданбаларын әзірлеу кезінде өткір болады.

Алдымен тарихқа көз жүгіртейік.

Quarkus императивті және реактивті бағдарламалауды қалай біріктіреді

Ағындар мен контейнерлер

8u131 нұсқасынан бастап Java эргономика функционалдығын жақсартуға байланысты контейнерлерге азды-көпті қолдау көрсете бастады. Атап айтқанда, JVM қазір қанша процессор ядросында жұмыс істейтінін біледі және сәйкесінше ағынды пулдарды (әдетте айыр/қосылу пулдарын) конфигурациялай алады. Әрине, бұл тамаша, бірақ бізде HTTP сервлеттерін пайдаланатын және Tomcat, Jetty және т. Нәтижесінде бұл қолданба әрбір сұрауға жеке ағынды береді және енгізу/шығару операцияларын күту кезінде, мысалы, дерекқорға, файлдарға немесе басқа қызметтерге қатынасу кезінде оған осы ағынды блоктауға мүмкіндік береді. Яғни, мұндай қолданбаның өлшемі қол жетімді ядролардың санына емес, бір уақыттағы сұраулар санына байланысты. Бұған қоса, бұл Кубернетестегі ядролар санына арналған квоталар немесе шектеулер бұл жерде көп көмектеспейді және мәселе ақырында дроссельмен аяқталады дегенді білдіреді.

Жадтың сарқылуы

Тақырыптар жады болып табылады. Контейнер ішіндегі жад шектеулері ешбір жағдайда панацея емес. Қолданбалар мен ағындардың санын көбейтуді бастаңыз, ерте ме, кеш пе коммутация жиілігінің сыни өсуіне және нәтижесінде өнімділіктің төмендеуіне тап боласыз. Сондай-ақ, қолданбаңыз дәстүрлі микросервис құрылымдарын пайдаланса немесе дерекқорға қосылса немесе кэштеуді пайдаланса немесе жадты басқаша пайдаланса, сізге JVM ішіне қарап, оны өлтірмей жадты қалай басқаратынын көруге мүмкіндік беретін құрал қажет екені анық. JVM өзі (мысалы, XX:+UseCGroupMemoryLimitForHeap). Java 9 нұсқасынан бері JVM топтарды қабылдауды және сәйкесінше бейімделуді үйренсе де, жадты сақтау және басқару өте күрделі мәселе болып қала береді.

Квоталар мен шектеулер

Java 11 процессорлық квоталарды қолдауды енгізді (мысалы, PreferContainerQuotaForCPUCount). Kubernetes сонымен қатар шектеулер мен квоталарды қолдауды ұсынады. Иә, мұның бәрі мағынасы бар, бірақ егер қолданба қайтадан бөлінген квотадан асып кетсе, біз тағы да өлшемге ие боламыз - дәстүрлі Java қолданбалары сияқты - ядролар санымен және әрқайсысы үшін жеке ағынның бөлінуімен анықталады. сұрау, онда мұның барлығында мағынасы аз.
Бұған қоса, квоталар мен шектеулерді немесе Kubernetes негізінде жатқан платформаның кеңейту функцияларын пайдалансаңыз, мәселе де өздігінен шешілмейді. Біз бастапқы мәселені шешуге көбірек ресурстарды жұмсаймыз немесе артық жұмсаймыз. Ал егер бұл жалпыға қолжетімді бұлттағы жоғары жүктемелі жүйе болса, біз шынымен қажет болғаннан көп ресурстарды пайдаланамыз.

Ал мұның бәрін не істеу керек?

Қарапайым тілмен айтқанда, Netty сияқты асинхронды және блокталмаған енгізу/шығару кітапханаларын және фреймворктарды пайдаланыңыз, Vert.x немесе Акка. Олар реактивті табиғатына байланысты контейнерлерде жұмыс істеуге әлдеқайда қолайлы. Блокталмаған енгізу/шығару арқасында бір ағын бірнеше бір уақыттағы сұрауларды өңдей алады. Бір сұрау енгізу/шығару нәтижелерін күтіп тұрғанда, оны өңдеу ағыны шығарылады және басқа сұраумен қабылданады. Енгізу/шығару нәтижелері ең соңында келгенде, бірінші сұрауды өңдеу жалғасады. Бір ағындағы сұрауларды аралық өңдеу арқылы ағындардың жалпы санын азайтуға және сұрауларды өңдеуге арналған ресурс шығынын азайтуға болады.

Блокталмаған енгізу/шығару кезінде ядролар саны негізгі параметрге айналады, себебі ол параллель орындалатын енгізу/шығару ағындарының санын анықтайды. Дұрыс пайдаланған кезде бұл жүктемені ядролар арасында тиімді бөлуге және аз ресурстармен жоғары жұмыс жүктемелерін өңдеуге мүмкіндік береді.

Қалай, бәрі солай ма?

Жоқ, басқа нәрсе бар. Реактивті бағдарламалау ресурстарды жақсырақ пайдалануға көмектеседі, бірақ сонымен бірге бағасы да бар. Атап айтқанда, кодты блоктамау және енгізу/шығару ағындарын блоктауды болдырмау принциптеріне сәйкес қайта жазу керек. Және бұл әзірлеу мен орындаудың мүлдем басқа үлгісі. Ал мұнда пайдалы кітапханалар көп болғанымен, бұл әдеттегі ойлау тәсілін түбегейлі өзгерту.

Алдымен асинхронды түрде жұмыс істейтін кодты жазуды үйрену керек. Блокталмаған енгізу/шығару мүмкіндігін пайдалануды бастағаннан кейін сұрауға жауап алған кезде не болатынын нақты көрсету керек. Жай блоктау және күту енді жұмыс істемейді. Оның орнына сіз кері қоңырауларды жібере аласыз, реактивті бағдарламалауды немесе жалғастыруды пайдалана аласыз. Бірақ бұл бәрі емес: блокталмаған енгізу/шығару пайдалану үшін сізге блокталмаған серверлер де, клиенттер де қажет, жақсырақ барлық жерде. HTTP жағдайында бәрі қарапайым, бірақ дерекқорлар, файлдық жүйелер және т.б. бар.

Жалпы реактивтілік тиімділікті жоғарылатса да, мұндай ауысуды іс жүзінде қабылдау қиын болуы мүмкін. Демек, реактивті және императивті кодты біріктіру мүмкіндігі келесі әрекеттерді орындау үшін міндетті шартқа айналады:

  1. Бағдарламалық қамтамасыз ету жүйесінің ең жүктелген аймақтарында ресурстарды тиімді пайдалану;
  2. Қалған бөліктерінде қарапайым стиль кодын пайдаланыңыз.

Кваркуспен таныстыру

Шын мәнінде, бұл Quarkus мәні - реактивті және императивті үлгілерді бір орындалу ортасы ішінде біріктіру.

Quarkus Vert.x және Netty негізінде жасалған, оның үстіңгі жағында әзірлеушіге көмектесетін реактивті құрылымдар мен кеңейтімдер бар. Quarkus тек HTTP микросервистерін ғана емес, сонымен қатар оқиғаларға негізделген архитектураларды құруға арналған. Өзінің реактивті сипатына байланысты ол хабар алмасу жүйелерімен (Apache Kafka, AMQP және т.б.) өте тиімді жұмыс істейді.

Бұл бір реактивті қозғалтқышты императивті және реактивті код үшін қалай пайдалану керектігі.

Quarkus императивті және реактивті бағдарламалауды қалай біріктіреді

Кваркус мұны керемет жасайды. Императивті және реактивті арасындағы таңдау анық - екеуі үшін де реактивті ядроны пайдаланыңыз. Оның шынымен көмектесетіні - бұл оқиға циклі ағыны арқылы өтетін барлық дерлік, яғни IO ағынын өңдейтін жылдам, блокталмаған код. Бірақ егер сізде классикалық REST немесе клиенттік қолданбалар болса, Quarkus-та дайын бағдарламалау үлгісі бар. Мысалы, Quarkus жүйесіндегі HTTP қолдауы блокталмаған және реактивті қозғалтқышты (Eclipse Vert.x және Netty) пайдалануға негізделген. Қолданбаңыз қабылдаған барлық HTTP сұраулары алдымен оқиға циклі (IO Thread) арқылы өтеді, содан кейін сұрауларды басқаратын код бөлігіне жіберіледі. Тағайындалған орынға байланысты сұрауды басқару кодын жеке ағынның ішінде шақыруға болады (сервлеттер мен Jax-RS жағдайында қолданылатын жұмысшы ағыны деп аталады) немесе бастапқы енгізу/шығару ағынын (реактивті маршрут) пайдалануға болады.

Quarkus императивті және реактивті бағдарламалауды қалай біріктіреді

Хабар алмасу жүйесінің қосқыштары Vert.x қозғалтқышының үстінде жұмыс істейтін блоктамайтын клиенттерді пайдаланады. Сондықтан хабар алмасу аралық бағдарламалық құрал жүйелерінен хабарламаларды тиімді жіберуге, қабылдауға және өңдеуге болады.

Сайтта Quarkus.io Мұнда Quarkus-ты бастауға көмектесетін бірнеше жақсы оқулықтар берілген:

Сондай-ақ біз сізге реактивті бағдарламалаудың әртүрлі аспектілерін жай браузерде, IDE қажет емес және компьютерді қажет етпейтін оқыту үшін онлайн практикалық оқулықтар жасадық. Сіз бұл сабақтарды таба аласыз осында.

Пайдалы ресурстар

Тақырыппен танысу үшін Quarkus бойынша 10 бейне сабақ

Олар сайтта айтқандай Quarkus.io, Кваркус - болып табылады Kubernetes-бағдарланған Java стегі, GraalVM және OpenJDK HotSpot үшін бейімделген және ең жақсы Java кітапханалары мен стандарттарынан жинақталған.

Тақырыпты түсінуге көмектесу үшін біз Кваркустың әртүрлі аспектілерін және оны пайдалану мысалдарын қамтитын 10 бейне оқулықты таңдадық:

1. Quarkus-пен таныстыру: Kubernetes үшін келесі буын Java құрылымы

Томас Кварнстром және Джейсон Грин
Quarkus жобасының мақсаты Kubernetes және серверсіз орталар үшін Java платформасын жасау және реактивті және императивті бағдарламалау үлгілерін бір орындалу ортасына біріктіру болып табылады, осылайша әзірлеушілер таратылған қолданба архитектураларының кең ауқымымен жұмыс істегенде өз тәсілдерін икемді түрде өзгерте алады. Төмендегі кіріспе лекциядан көбірек біліңіз.

2. Кваркус: өте жылдам субатомдық Java

Авторы: Берр Саттер
DevNation Live ұсынған бұл бейне оқу құралы Kubernetes/OpenShift ортасында корпоративтік Java қолданбаларын, API интерфейстерін, микросервистерді және серверсіз функцияларды оңтайландыру үшін Quarkus-ты қалай пайдалану керектігін көрсетеді, бұл оларды әлдеқайда кішірек, жылдамырақ және масштабталатын етеді.

3. Quarkus және GraalVM: күту режимін супер жылдамдыққа дейін жеделдету және оны субатомдық өлшемдерге дейін кішірейту

Авторы: Санне Гриноверо
Презентациядан сіз Quarkus қалай пайда болғанын, оның қалай жұмыс істейтінін және оның GraalVM кескіндерімен үйлесімді Hibernate ORM сияқты күрделі кітапханаларды қалай жасауға мүмкіндік беретінін білесіз.

4. Серверсіз қосымшаларды әзірлеуді үйреніңіз

Авторы: Мартин Лютер
Төмендегі бейне Quarkus көмегімен қарапайым Java қолданбасын жасау және оны Knative жүйесінде серверсіз қолданба ретінде қолдану жолын көрсетеді.

5. Кваркус: кодтауды көңілді өткізіңіз

Авторы: Эдсон Янага
Quarkus неліктен әзірлеушілердің жүрегін жаулап алғанын түсінуге мүмкіндік беретін бірінші Quarkus жобаңызды жасауға арналған бейне нұсқаулық.

6. Java және контейнерлер - олардың болашағы қандай болмақ

Авторы Марк Литтл
Бұл презентация Java тарихымен таныстырады және Quarkus неліктен Java болашағы екенін түсіндіреді.

7. Кваркус: өте жылдам субатомдық Java

Авторы: Димитрис Андреадис
Әзірлеушілер мойындаған Quarkus артықшылықтарына шолу: қарапайымдылық, өте жоғары жылдамдықтар, ең жақсы кітапханалар мен стандарттар.

8. Кваркус және субатомдық зымыран жүйелері

Авторы: Клемент Эскоффиер
GraalVM интеграциясы арқылы Quarkus ультра жылдам әзірлеу тәжірибесін және субатомдық орындалу ортасын қамтамасыз етеді. Автор Quarkus реактивті жағы туралы және оны реактивті және ағынды қосымшаларды құру үшін қалай пайдалану керектігі туралы айтады.

9. Quarkus және Eclipse MicroProfile қолданбасын жылдам әзірлеу

Авторы: Джон Клинган
Eclipse MicroProfile және Quarkus біріктіру арқылы әзірлеушілер ондаған миллисекундтарда іске қосылатын толық функционалды контейнерлік MicroProfile қолданбаларын жасай алады. Бейнеде Kubernetes платформасында орналастыру үшін контейнерлік MicroProfile қолданбасын кодтау жолы егжей-тегжейлі сипатталған.

10. Java, «Turbo» нұсқасы

Авторы: Маркус Бил
Автор, әсіресе серверсіз орталарда нақты жетістіктерге қол жеткізуге мүмкіндік беретін өте кішкентай, өте жылдам Java контейнерлерін жасау үшін Quarkus пайдалану жолын көрсетеді.



Ақпарат көзі: www.habr.com

пікір қалдыру