Quarkus qanday qilib imperativ va reaktiv dasturlashni birlashtiradi

Bu yil biz konteyner mavzularini jiddiy ishlab chiqishni rejalashtirmoqdamiz, Cloud-Native Java и Kubernetes. Ushbu mavzularning mantiqiy davomi allaqachon Kvarkus ramkasi haqidagi hikoya bo'ladi hisobga olinadi Habré-da. Bugungi maqola "subatomik superfast Java" dizayni haqida kamroq va Quarkusning Enterprise-ga bergan va'dalari haqida.

Quarkus qanday qilib imperativ va reaktiv dasturlashni birlashtiradi

Java va JVM hanuzgacha juda mashhur, ammo serversiz texnologiyalar va bulutli mahalliy mikroservislar bilan ishlashda Java va boshqa JVM tillari kamroq va kamroq qo'llaniladi, chunki ular xotirada juda ko'p joy egallaydi va juda sekin yuklanadi, bu ularni qiladi. qisqa muddatli konteynerlar bilan foydalanish uchun yomon mos keladi. Yaxshiyamki, bu holat Kvarkus tufayli o'zgara boshladi.

Superfast subatomik Java yangi darajaga ko'tarildi!

42 ta relizlar, 8 oylik jamoat ishlari va 177 ta ajoyib dasturchilar - bularning barchasi natijasi 2019 yil noyabr oyida chiqarilgan. Kvarkus 1.0, loyihani rivojlantirishda muhim bosqichni belgilovchi va juda ko'p ajoyib xususiyatlar va imkoniyatlarni taklif qiluvchi reliz (ular haqida ko'proq o'qishingiz mumkin. e'lon).

Bugun biz sizga Quarkus qanday qilib imperativ va reaktiv dasturlash modellarini bitta reaktiv yadroga birlashtirganini ko'rsatamiz. Biz qisqacha tarixdan boshlaymiz va keyin Quarkus reaktiv yadro dualizmi nima ekanligini va qanday qilib batafsil ma'lumotga ega bo'lamiz. Java-Ishlab chiquvchilar ushbu imtiyozlardan foydalanishlari mumkin.

Mikroservislar, hodisalarga asoslangan arxitekturalar и serversiz-funksiyalar - bularning barchasi, ular aytganidek, bugungi kunda o'sib bormoqda. So'nggi paytlarda bulutga asoslangan arxitekturalarni yaratish ancha oson va qulayroq bo'ldi, ammo muammolar saqlanib qolmoqda - ayniqsa Java dasturchilari uchun. Masalan, serversiz funksiyalar va mikroservislar bo'lsa, ishga tushirish vaqtini qisqartirish, xotira sarfini kamaytirish va baribir ularning rivojlanishini yanada qulay va yoqimli qilish zarurati tug'iladi. Java so'nggi yillarda bir nechta yaxshilanishlarni amalga oshirdi, masalan, konteynerlar uchun yaxshilangan ergonomika funksionalligi va boshqalar. Biroq, Java-ning konteynerda to'g'ri ishlashi hali ham qiyin. Shunday qilib, biz Java-ning ba'zi o'ziga xos murakkabliklarini ko'rib chiqishdan boshlaymiz, ular konteynerga yo'naltirilgan Java ilovalarini ishlab chiqishda ayniqsa dolzarbdir.

Birinchidan, tarixga qaraylik.

Quarkus qanday qilib imperativ va reaktiv dasturlashni birlashtiradi

Oqimlar va konteynerlar

8u131 versiyasidan boshlab Java ergonomika funksiyalarining yaxshilanishi tufayli konteynerlarni ko'proq yoki kamroq qo'llab-quvvatlay boshladi. Xususan, JVM endi qancha protsessor yadrolarida ishlayotganini biladi va shunga mos ravishda iplar hovuzlarini (odatda vilkalar/birlashma hovuzlarini) sozlashi mumkin. Albatta, bu ajoyib, lekin bizda HTTP servletlaridan foydalanadigan va Tomcat, Jetty va hokazolarda ishlaydigan an'anaviy veb-ilovamiz bor deylik. Natijada, ushbu dastur har bir so'rovga alohida trek beradi va kiritish-chiqarish operatsiyalarini kutayotganda, masalan, ma'lumotlar bazasiga, fayllarga yoki boshqa xizmatlarga kirishda ushbu mavzuni bloklash imkonini beradi. Ya'ni, bunday dasturning hajmi mavjud yadrolar soniga bog'liq emas, balki bir vaqtning o'zida so'rovlar soniga bog'liq. Bundan tashqari, bu shuni anglatadiki, Kubernetes-dagi yadrolar soni bo'yicha kvotalar yoki cheklovlar bu erda unchalik yordam bermaydi va masala oxir-oqibat siqilish bilan tugaydi.

Xotiraning charchashi

Mavzular xotiradir. Va konteyner ichidagi xotira cheklovlari hech qanday panatseya emas. Ilovalar va mavzular sonini ko'paytirishni boshlang va ertami-kechmi siz almashtirish chastotasining keskin o'sishiga va natijada ishlashning pasayishiga duch kelasiz. Bundan tashqari, agar ilovangiz an'anaviy mikroservis ramkalaridan foydalansa yoki ma'lumotlar bazasiga ulansa yoki keshlashdan foydalansa yoki xotirani boshqa yo'l bilan ishlatsa, sizga JVM ichiga qarash va uning xotirani o'ldirmasdan qanday boshqarishini ko'rish imkonini beruvchi vosita kerak bo'ladi. JVMning o'zi (masalan, XX:+UseCGroupMemoryLimitForHeap). Va Java 9 dan beri JVM guruhlarni qabul qilishni va shunga mos ravishda moslashishni o'rgangan bo'lsa ham, xotirani zaxiralash va boshqarish juda murakkab masala bo'lib qolmoqda.

Kvota va chegaralar

Java 11 protsessor kvotalari (masalan, PreferContainerQuotaForCPUCount) uchun qo'llab-quvvatlashni joriy qildi. Kubernetes shuningdek, limitlar va kvotalar uchun yordam taklif qiladi. Ha, bularning barchasi mantiqqa to'g'ri keladi, lekin agar dastur yana ajratilgan kvotani oshib ketsa, biz yana o'lchamga erishamiz - an'anaviy Java ilovalarida bo'lgani kabi - yadrolar soni va har biri uchun alohida mavzuni ajratish bilan belgilanadi. iltimos, unda bularning barchasida ozgina ma'no bor.
Bunga qo'shimcha ravishda, agar siz Kubernetes asosidagi platformaning kvotalar va chegaralar yoki kengaytirish funksiyalaridan foydalansangiz, muammo ham o'z-o'zidan hal etilmaydi. Biz shunchaki asl muammoni hal qilish uchun ko'proq resurslarni sarflaymiz yoki ortiqcha xarajat qilamiz. Va agar bu umumiy ommaviy bulutdagi yuqori yuklangan tizim bo'lsa, biz deyarli kerak bo'lgandan ko'ra ko'proq resurslardan foydalanamiz.

Va bularning barchasi bilan nima qilish kerak?

Oddiy qilib aytganda, asinxron va bloklanmaydigan kiritish-chiqarish kutubxonalari va Netty kabi ramkalardan foydalaning, Vert.x yoki Akka. Ular reaktiv tabiati tufayli konteynerlarda ishlash uchun ancha mos keladi. Bloklanmagan kiritish-chiqarish tufayli, bir xil oqim bir vaqtning o'zida bir nechta so'rovlarni qayta ishlashi mumkin. Bitta so'rov kiritish-chiqarish natijalarini kutayotganda, uni qayta ishlash jarayoni chiqariladi va boshqa so'rov tomonidan qabul qilinadi. Va nihoyat, kiritish-chiqarish natijalari kelganda, birinchi so'rovni qayta ishlash davom etadi. Xuddi shu mavzudagi so'rovlarni interleaved qayta ishlash orqali siz mavzularning umumiy sonini kamaytirishingiz va so'rovlarni qayta ishlash uchun resurs sarfini kamaytirishingiz mumkin.

Bloklanmagan kiritish-chiqarish bilan yadrolar soni asosiy parametrga aylanadi, chunki u parallel ravishda bajarilishi mumkin bo'lgan kiritish-chiqarish iplari sonini aniqlaydi. To'g'ri foydalanilganda, bu yukni yadrolar o'rtasida samarali taqsimlash va kamroq resurslar bilan yuqori ish yuklarini boshqarish imkonini beradi.

Qanday qilib, hammasi shumi?

Yo'q, boshqa narsa bor. Reaktiv dasturlash resurslardan yaxshiroq foydalanishga yordam beradi, lekin ayni paytda qimmatga tushadi. Xususan, kodni blokirovka qilmaslik tamoyillariga muvofiq qayta yozish va kirish/chiqarish iplarini blokirovka qilishdan qochish kerak bo'ladi. Va bu ishlab chiqish va amalga oshirishning butunlay boshqacha modeli. Va bu erda juda ko'p foydali kutubxonalar mavjud bo'lsa-da, bu hali ham odatiy fikrlash tarzida tubdan o'zgarishdir.

Birinchidan, asenkron ishlaydigan kod yozishni o'rganishingiz kerak. Bloklanmagan I/U dan foydalanishni boshlaganingizdan so'ng, so'rovga javob olinganda nima bo'lishini aniq belgilashingiz kerak. Shunchaki blokirovka qilish va kutish endi ishlamaydi. Buning o'rniga siz qayta qo'ng'iroqlarni o'tkazishingiz, reaktiv dasturlash yoki davom ettirishdan foydalanishingiz mumkin. Lekin bu hammasi emas: bloklanmaydigan kiritish-chiqarishdan foydalanish uchun sizga bloklanmaydigan serverlar ham, mijozlar ham kerak, yaxshisi hamma joyda. HTTP holatida hamma narsa oddiy, ammo ma'lumotlar bazalari, fayl tizimlari va boshqalar mavjud.

Va umumiy uchdan-uchgacha reaktivlik samaradorlikni maksimal darajada oshirsa-da, bunday siljish amalda oshqozonni qiyinlashtirishi mumkin. Shunday qilib, reaktiv va imperativ kodni birlashtirish qobiliyati quyidagilar uchun zaruriy shartga aylanadi:

  1. Dasturiy ta'minot tizimining eng yuklangan sohalarida resurslardan samarali foydalanish;
  2. Qolgan qismlarida oddiyroq uslub kodidan foydalaning.

Quarkus bilan tanishtirish

Aslida, bu Quarkusning mohiyatidir - reaktiv va imperativ modellarni bitta ish vaqti muhitida birlashtirish.

Quarkus Vert.x va Netty-ga asoslangan bo'lib, ishlab chiquvchiga yordam berish uchun bir qator reaktiv ramkalar va kengaytmalar mavjud. Quarkus nafaqat HTTP mikroservislarini, balki voqealarga asoslangan arxitekturalarni ham yaratish uchun mo'ljallangan. Reaktiv tabiati tufayli u xabar almashish tizimlari (Apache Kafka, AMQP va boshqalar) bilan juda samarali ishlaydi.

Ayyorlik, imperativ va reaktiv kod uchun bir xil reaktiv dvigateldan qanday foydalanishdir.

Quarkus qanday qilib imperativ va reaktiv dasturlashni birlashtiradi

Kvarkus buni ajoyib tarzda bajaradi. Imperativ va reaktiv o'rtasidagi tanlov aniq - ikkalasi uchun reaktiv yadrodan foydalaning. Bu haqiqatan ham yordam beradigan narsa tez, bloklanmaydigan kod bo'lib, voqea-loop ipidan o'tadigan deyarli hamma narsani boshqaradi, ya'ni IO ipi. Ammo agar sizda klassik REST yoki mijoz ilovalari bo'lsa, Quarkus-da tayyor dasturlash modeli mavjud. Misol uchun, Quarkusdagi HTTP qo'llab-quvvatlashi bloklanmaydigan va reaktiv dvigateldan foydalanishga asoslangan (Eclipse Vert.x va Netty). Ilovangiz tomonidan qabul qilingan barcha HTTP so'rovlari birinchi navbatda voqea tsikli (IO Thread) orqali o'tadi va so'ngra kodning so'rovlarni boshqaradigan qismiga yuboriladi. Belgilangan joyga qarab, so'rovni boshqarish kodi alohida oqim ichida chaqirilishi mumkin (servletlar va Jax-RS misolida ishlatiladigan ishchi ip deb ataladi) yoki manba kiritish-chiqarish oqimidan (reaktiv marshrut) foydalanish mumkin.

Quarkus qanday qilib imperativ va reaktiv dasturlashni birlashtiradi

Xabarlar tizimi konnektorlari Vert.x dvigatelining tepasida ishlaydigan bloklanmagan mijozlardan foydalanadi. Shunday qilib, siz xabar almashish o'rta dasturlari tizimlaridan xabarlarni samarali yuborishingiz, qabul qilishingiz va qayta ishlashingiz mumkin.

Saytda Quarkus.io Quarkus bilan boshlashingizga yordam beradigan ba'zi yaxshi qo'llanmalar:

Shuningdek, biz sizga reaktiv dasturlashning turli jihatlarini faqat brauzerda o‘rgatish uchun onlayn amaliy qo‘llanmalarni yaratdik, IDE talab qilinmaydi va kompyuter talab qilinmaydi. Siz ushbu darslarni topishingiz mumkin shu yerda.

Foydali manbalar

Mavzu bilan tanishish uchun Quarkus bo'yicha 10 ta video dars

Saytda aytganidek Quarkus.io, Kvarkus - deb Kubernetes-yo'naltirilgan Java stek, GraalVM va OpenJDK HotSpot uchun moslashtirilgan va eng yaxshi Java kutubxonalari va standartlaridan yig'ilgan.

Mavzuni tushunishingizga yordam berish uchun biz Quarkusning turli jihatlarini va undan foydalanish misollarini o'z ichiga olgan 10 ta video darslarni tanladik:

1. Quarkus bilan tanishish: Kubernetes uchun keyingi avlod Java Framework

Tomas Kvarnstrom va Jeyson Grin tomonidan
Quarkus loyihasining maqsadi Kubernetes va serversiz muhitlar uchun Java platformasini yaratish hamda reaktiv va imperativ dasturlash modellarini yagona ish vaqti muhitiga birlashtirishdan iborat boʻlib, ishlab chiquvchilar keng doiradagi tarqalgan dastur arxitekturalari bilan ishlashda oʻz yondashuvlarini moslashuvchan tarzda oʻzgartirishi mumkin. Qo'shimcha ma'lumotni quyidagi kirish ma'ruzasida bilib oling.

2. Quarkus: Superfast Subatomik Java

Muallif: Burr Sutter
DevNation Live-dan olingan ushbu video darsligi Kubernetes/OpenShift muhitida korporativ Java ilovalari, API-lar, mikroservislar va serversiz funksiyalarni optimallashtirish uchun Quarkus-dan qanday foydalanishni ko'rsatib beradi, bu ularni ancha kichikroq, tezroq va kengaytirilishi mumkin.

3. Quarkus va GraalVM: Kutish rejimini super tezlikka tezlashtirish va uni subatomik o'lchamlarga qisqartirish

Muallif: Sanne Grinovero
Taqdimotdan siz Quarkus qanday paydo bo'lganini, u qanday ishlashini va u sizga GraalVM tasvirlari bilan mos keladigan Hibernate ORM kabi murakkab kutubxonalarni qanday yaratishga imkon berishini bilib olasiz.

4. Serversiz ilovalarni ishlab chiqishni o'rganing

Muallif: Martin Lyuter
Quyidagi videoda Quarkus yordamida oddiy Java ilovasini qanday yaratish va uni Knative-da serversiz dastur sifatida joylashtirish ko'rsatilgan.

5. Quarkus: Kodlashdan zavqlaning

Muallif: Edson Yanaga
Quarkus nima uchun ishlab chiquvchilar qalbini zabt etayotganini tushunishga imkon beruvchi birinchi Quarkus loyihangizni yaratish bo'yicha video qo'llanma.

6. Java va konteynerlar - ularning kelajagi birgalikda qanday bo'ladi

Mark Little tomonidan yozilgan
Ushbu taqdimot Java tarixi bilan tanishtiradi va nima uchun Quarkus Java kelajagi ekanligini tushuntiradi.

7. Quarkus: Superfast Subatomik Java

Muallif: Dimitris Andreadis
Ishlab chiquvchilar tomonidan e'tirof etilgan Quarkusning afzalliklari haqida umumiy ma'lumot: soddalik, o'ta yuqori tezlik, eng yaxshi kutubxonalar va standartlar.

8. Kvarkus va atom osti raketa tizimlari

Muallif: Klement Escoffier
GraalVM bilan integratsiyalashuv orqali Quarkus o'ta tezkor rivojlanish tajribasi va subatomik ish vaqti muhitini taqdim etadi. Muallif Quarkusning reaktiv tomoni va undan reaktiv va oqimli ilovalarni yaratish uchun qanday foydalanish haqida gapiradi.

9. Quarkus va Eclipse MicroProfile-da tezkor dastur ishlab chiqish

Muallif: Jon Klingan
Eclipse MicroProfile va Quarkusni birlashtirib, ishlab chiquvchilar o'nlab millisekundlarda ishga tushadigan to'liq xususiyatli konteynerli MicroProfile ilovalarini yaratishlari mumkin. Videoda Kubernetes platformasida joylashtirish uchun konteynerlangan MicroProfile ilovasini qanday kodlash haqida batafsil ma'lumot berilgan.

10. Java, "Turbo" versiyasi

Muallif: Marcus Biel
Muallif, ayniqsa serversiz muhitda haqiqiy yutuqlarni ta'minlaydigan o'ta kichik, o'ta tezkor Java konteynerlarini yaratish uchun Quarkusdan qanday foydalanishni ko'rsatadi.



Manba: www.habr.com

a Izoh qo'shish