Quarkus imperativ və reaktiv proqramlaşdırmanı necə birləşdirir

Bu il konteyner mövzularını ciddi şəkildə inkişaf etdirməyi planlaşdırırıq, Bulud-Doğma Java и Kubernetes. Bu mövzuların məntiqi davamı artıq Quarkus çərçivəsi haqqında hekayə olacaq hesab olunur Habré haqqında. Bugünkü məqaləmiz daha az "atomaltı super sürətli Java" dizaynı və Quarkusun Enterprise-a verdiyi vəd haqqındadır.

Quarkus imperativ və reaktiv proqramlaşdırmanı necə birləşdirir

Java və JVM hələ də son dərəcə populyardır, lakin serversiz texnologiyalar və bulud-doğma mikroservislərlə işləyərkən Java və digər JVM dilləri getdikcə daha az istifadə olunur, çünki onlar çox yaddaş yeri tutur və yükləmək üçün çox yavaşdırlar qısamüddətli qablarla istifadə üçün zəif uyğundur. Xoşbəxtlikdən bu vəziyyət indi Quarkus sayəsində dəyişməyə başlayır.

Super sürətli atomaltı Java yeni səviyyəyə çatdı!

42 buraxılış, 8 aylıq icma işi və 177 heyrətamiz tərtibatçı - bunların hamısının nəticəsi 2019-cu ilin noyabrında buraxılış oldu Quarkus 1.0, layihənin inkişafında mühüm mərhələni qeyd edən və çoxlu gözəl xüsusiyyətlər və imkanlar təklif edən buraxılış (onlar haqqında ətraflı oxuya bilərsiniz elan).

Bu gün biz sizə Quarkusun imperativ və reaktiv proqramlaşdırma modellərini tək reaktiv nüvədə necə birləşdirdiyini göstərəcəyik. Qısa bir tarixlə başlayacağıq və sonra Quarkusun reaktiv əsas dualizminin nə olduğu və necə olduğu haqqında təfərrüata girəcəyik. Java-Yaradıcılar bu üstünlüklərdən yararlana bilərlər.

Mikroservislər, hadisələrə əsaslanan arxitekturalar и serversiz-funksiyalar – bütün bunlar, necə deyərlər, bu gün yüksəlişdədir. Bu yaxınlarda bulud mərkəzli arxitekturaların yaradılması daha asan və daha əlçatan oldu, lakin problemlər qalmaqdadır - xüsusilə Java tərtibatçıları üçün. Məsələn, serversiz funksiyalar və mikroservislər vəziyyətində, işə başlama vaxtını azaltmaq, yaddaş istehlakını azaltmaq və yenə də onların işlənməsini daha rahat və zövqlü etmək üçün təcili ehtiyac var. Java son illərdə bir sıra təkmilləşdirmələr etdi, məsələn, qablar üçün təkmilləşdirilmiş erqonomik funksionallıq və s. Bununla belə, Java-nın konteynerdə düzgün işləməsi hələ də çətindir. Beləliklə, biz konteyner yönümlü Java proqramlarını inkişaf etdirərkən xüsusilə kəskin olan Java-ya xas olan bəzi mürəkkəbliklərə nəzər salmaqla başlayacağıq.

Əvvəlcə tarixə nəzər salaq.

Quarkus imperativ və reaktiv proqramlaşdırmanı necə birləşdirir

Axınlar və konteynerlər

8u131 versiyasından başlayaraq Java erqonomik funksionallığın təkmilləşdirilməsi səbəbindən konteynerləri az və ya çox dəstəkləməyə başladı. Xüsusilə, JVM indi neçə prosessor nüvəsində işlədiyini bilir və müvafiq olaraq iplik hovuzlarını (adətən çəngəl/qoşulma hovuzlarını) konfiqurasiya edə bilir. Əlbəttə ki, bu əladır, amma deyək ki, HTTP servletlərindən istifadə edən və Tomcat, Jetty və s.-də işləyən ənənəvi veb proqramımız var. Nəticədə, bu proqram hər bir sorğuya ayrıca mövzu verəcək və I/O əməliyyatlarını gözləyərkən, məsələn, verilənlər bazasına, fayllara və ya digər xidmətlərə daxil olarkən ona bu başlığı bloklamağa imkan verəcək. Yəni, belə bir tətbiqin ölçüsü mövcud nüvələrin sayından deyil, eyni vaxtda edilən sorğuların sayından asılıdır. Bundan əlavə, bu o deməkdir ki, Kubernetes-də nüvələrin sayına dair kvotalar və ya məhdudiyyətlər burada çox kömək etməyəcək və məsələ sonda tənzimləmə ilə bitəcək.

Yaddaşın tükənməsi

Mövzular yaddaşdır. Və konteynerdaxili yaddaş məhdudiyyətləri heç bir şəkildə panacea deyil. Sadəcə tətbiqlərin və mövzuların sayını artırmağa başlayın və gec-tez siz keçid tezliyində kritik bir artım və nəticədə performansın azalması ilə qarşılaşacaqsınız. Həmçinin, əgər tətbiqiniz ənənəvi mikroservis çərçivələrindən istifadə edirsə və ya verilənlər bazasına qoşulursa və ya keşləşdirmədən istifadə edirsə və ya başqa bir şəkildə yaddaşdan istifadə edirsə, açıq-aydın sizə JVM-nin içərisinə baxmaq və onun yaddaşı öldürmədən yaddaşı necə idarə etdiyini görmək imkanı verən alətə ehtiyacınız var. JVM özü (məsələn, XX:+UseCGroupMemoryLimitForHeap). Java 9-dan bəri JVM qrupları qəbul etməyi və buna uyğun uyğunlaşmağı öyrənsə də, yaddaşın saxlanması və idarə edilməsi kifayət qədər mürəkkəb məsələ olaraq qalır.

Kvotalar və məhdudiyyətlər

Java 11 CPU kvotalarına dəstək təqdim etdi (məsələn, PreferContainerQuotaForCPUCount). Kubernetes həmçinin limitlər və kvotalar üçün dəstək təklif edir. Bəli, bunların hamısı məntiqlidir, amma tətbiq yenidən ayrılmış kvotanı aşarsa, biz yenə də nüvələrin sayı və hər biri üçün ayrıca bir mövzunun ayrılması ilə müəyyən edilən ənənəvi Java proqramlarında olduğu kimi ölçüsü ilə başa çatırıq. istək, onda bütün bunların mənası azdır.
Bundan əlavə, kvota və məhdudiyyətlərdən və ya Kubernetes-in altında yatan platformanın genişləndirmə funksiyalarından istifadə etsəniz, problem də özünü həll etmir. Biz sadəcə olaraq ilkin problemin həllinə daha çox resurs xərcləyirik və ya həddindən artıq xərcləyirik. Və əgər bu ictimai ictimai buludda yüksək yüklü sistemdirsə, demək olar ki, biz həqiqətən ehtiyac duyduğumuzdan daha çox resursdan istifadə edirik.

Və bütün bunlarla nə etmək lazımdır?

Sadə dillə desək, asinxron və bloklanmayan I/O kitabxanaları və Netty kimi çərçivələrdən istifadə edin, Vert.x ya da Akka. Reaktiv təbiətlərinə görə konteynerlərdə işləmək üçün daha uyğundurlar. Bloklanmayan I/O sayəsində eyni ip eyni vaxtda çoxsaylı sorğuları emal edə bilər. Bir sorğu I/O nəticələrini gözləyərkən, onu emal edən ip buraxılır və başqa sorğu tərəfindən qəbul edilir. I/O nəticələri nəhayət çatdıqda, ilk sorğunun işlənməsi davam edir. Eyni mövzu daxilində sorğuların interleaved işlənməsi ilə siz mövzuların ümumi sayını azalda və sorğuların işlənməsi üçün resurs istehlakını azalda bilərsiniz.

Bloklanmayan I/O ilə nüvələrin sayı əsas parametrə çevrilir, çünki o, paralel olaraq icra oluna bilən I/O tellərinin sayını müəyyən edir. Düzgün istifadə edildikdə, bu, yükü nüvələr arasında effektiv şəkildə bölüşdürməyə və daha az resursla daha yüksək iş yüklərini idarə etməyə imkan verir.

Necə, hamısı belədir?

Yox, başqa bir şey var. Reaktiv proqramlaşdırma resurslardan daha yaxşı istifadə etməyə kömək edir, həm də qiymətlidir. Xüsusilə, kod bloklanmamaq prinsiplərinə uyğun olaraq yenidən yazılmalı və giriş/çıxış iplərini bloklamaqdan çəkinməlidir. Və bu, tamamilə fərqli bir inkişaf və icra modelidir. Və burada çoxlu faydalı kitabxanalar olsa da, bu, adi düşüncə tərzində hələ də köklü dəyişiklikdir.

Əvvəlcə asinxron işləyən kodu necə yazmağı öyrənməlisiniz. Bloklanmayan I/O-dan istifadə etməyə başladıqdan sonra sorğuya cavab alındıqda nə baş verəcəyini açıq şəkildə göstərməlisiniz. Sadəcə bloklamaq və gözləmək artıq işləməyəcək. Bunun əvəzinə siz geri zəngləri ötürə, reaktiv proqramlaşdırmadan və ya davamdan istifadə edə bilərsiniz. Ancaq bu, hamısı deyil: bloklanmayan I/O-dan istifadə etmək üçün sizə həm bloklanmayan serverlər, həm də müştərilər, tercihen hər yerdə lazımdır. HTTP vəziyyətində hər şey sadədir, lakin verilənlər bazası, fayl sistemləri və daha çox şey var.

Ümumi uç-to-end reaktivliyi səmərəliliyi maksimuma çatdırsa da, praktikada belə bir dəyişiklik mədədə çətin ola bilər. Beləliklə, reaktiv və imperativ kodu birləşdirmək bacarığı:

  1. Proqram təminatı sisteminin ən çox yüklənmiş sahələrində resurslardan səmərəli istifadə etmək;
  2. Qalan hissələrində daha sadə üslub kodundan istifadə edin.

Quarkus ilə tanış olun

Əslində, Quarkusun mahiyyəti budur - reaktiv və imperativ modelləri vahid iş vaxtı mühitində birləşdirmək.

Quarkus Vert.x və Netty-yə əsaslanır, tərtibatçıya kömək etmək üçün bir sıra reaktiv çərçivələr və genişləndirmələr var. Quarkus yalnız HTTP mikroservislərini deyil, həm də hadisələrə əsaslanan arxitekturaları qurmaq üçün nəzərdə tutulmuşdur. Reaktiv təbiətinə görə mesajlaşma sistemləri (Apache Kafka, AMQP və s.) ilə çox effektiv işləyir.

Hiylə həm imperativ, həm də reaktiv kod üçün eyni reaktiv mühərrikdən necə istifadə etməkdir.

Quarkus imperativ və reaktiv proqramlaşdırmanı necə birləşdirir

Quarkus bunu parlaq şəkildə edir. İmperativ və reaktiv arasında seçim göz qabağındadır - hər ikisi üçün reaktiv nüvədən istifadə edin. Bunun həqiqətən kömək etdiyi şey, hadisə döngəsi ipindən keçən demək olar ki, hər şeyi idarə edən sürətli, bloklanmayan koddur, aka IO mövzusu. Ancaq klassik REST və ya müştəri tərəfi tətbiqləriniz varsa, Quarkus-un hazır bir imperativ proqramlaşdırma modeli var. Məsələn, Quarkus-da HTTP dəstəyi bloklanmayan və reaktiv mühərrikin (Eclipse Vert.x və Netty) istifadəsinə əsaslanır. Tətbiqiniz tərəfindən qəbul edilən bütün HTTP sorğuları əvvəlcə hadisə dövrəsindən (IO Thread) keçir və sonra kodun sorğuları idarə edən hissəsinə göndərilir. Təyinatdan asılı olaraq, sorğunun idarə kodu ayrı bir başlıq daxilində çağırıla bilər (servletlər və Jax-RS vəziyyətində istifadə olunan işçi ipi) və ya mənbə I/O ipindən (reaktiv marşrut) istifadə edilə bilər.

Quarkus imperativ və reaktiv proqramlaşdırmanı necə birləşdirir

Mesajlaşma sistemi konnektorları Vert.x mühərrikinin üstündə işləyən bloklanmayan müştərilərdən istifadə edir. Beləliklə, siz mesajlaşma ara proqram sistemlərindən mesajları effektiv şəkildə göndərə, qəbul edə və emal edə bilərsiniz.

Site Quarkus.io Quarkus ilə başlamağa kömək edəcək bəzi yaxşı dərsliklər bunlardır:

Biz həmçinin sizə reaktiv proqramlaşdırmanın müxtəlif aspektlərini sadəcə brauzerdə öyrətmək üçün onlayn praktiki dərsliklər yaratdıq, heç bir IDE tələb olunmur və kompüter tələb olunmur. Bu dərsləri tapa bilərsiniz burada.

Faydalı qaynaqlar

Mövzu ilə tanış olmaq üçün Quarkus haqqında 10 video dərs

Saytda deyildiyi kimi Quarkus.io, quarkus - Mi Kubernetes-yönümlü Java yığını, GraalVM və OpenJDK HotSpot üçün uyğunlaşdırılmış və ən yaxşı Java kitabxanaları və standartlarından yığılmışdır.

Mövzunu başa düşməyinizə kömək etmək üçün biz Quarkusun müxtəlif aspektlərini və ondan istifadə nümunələrini əhatə edən 10 video dərslik seçmişik:

1. Quarkus təqdimatı: Kubernetes üçün Yeni Nəsil Java Çərçivəsi

Thomas Qvarnstrom və Jason Greene tərəfindən
Quarkus layihəsinin məqsədi Kubernetes və serversiz mühitlər üçün Java platforması yaratmaq və reaktiv və imperativ proqramlaşdırma modellərini vahid iş vaxtı mühitində birləşdirməkdir ki, tərtibatçılar geniş yayılmış proqram arxitekturaları ilə işləyərkən yanaşmalarını çevik şəkildə dəyişə bilsinlər. Aşağıdakı giriş mühazirəsindən daha çox məlumat əldə edin.

2. Quarkus: Superfast Subatomic Java

Müəllif: Burr Sutter
DevNation Live-ın bu video dərsliyi Kubernetes/OpenShift mühitində korporativ Java proqramlarını, API-ləri, mikroservisləri və serversiz funksiyaları optimallaşdırmaq üçün Quarkus-dan necə istifadə etməyi nümayiş etdirir ki, bu da onları daha kiçik, daha sürətli və miqyaslana bilən edir.

3. Quarkus və GraalVM: Qışlama rejimini super sürətlərə qədər sürətləndirmək və atomaltı ölçülərə qədər kiçilmək

Müəllif: Sanne Grinovero
Təqdimatdan siz Quarkus-un necə yarandığını, onun necə işlədiyini və Hibernate ORM kimi mürəkkəb kitabxanaları yerli GraalVM şəkillərinə uyğunlaşdırmağa necə imkan verdiyini öyrənəcəksiniz.

4. Serversiz proqramlar hazırlamağı öyrənin

Müəllif: Martin Lüter
Aşağıdakı video Quarkus-dan istifadə edərək sadə Java proqramını necə yaratmağı və onu Knative-də serversiz proqram kimi yerləşdirməyi göstərir.

5. Quarkus: Kodlaşdırma ilə əylənin

Müəllif: Edson Yanaqa
Quarkusun niyə tərtibatçıların qəlbini fəth etdiyini anlamağa imkan verən ilk Quarkus layihənizi yaratmaq üçün video bələdçi.

6. Java və konteynerlər - onların birlikdə gələcəyi necə olacaq

Mark Little tərəfindən göndərildi
Bu təqdimat Java-nın tarixini təqdim edir və Quarkusun niyə Java-nın gələcəyi olduğunu izah edir.

7. Quarkus: Superfast Subatomic Java

Müəllif: Dimitris Andreadis
Tərtibatçılar tərəfindən tanınan Quarkus üstünlüklərinə ümumi baxış: sadəlik, ultra yüksək sürət, ən yaxşı kitabxanalar və standartlar.

8. Kvarkus və atomaltı raket sistemləri

Müəllif: Clement Escoffier
GraalVM ilə inteqrasiya vasitəsilə Quarkus ultra sürətli inkişaf təcrübəsi və atomaltı iş vaxtı mühiti təmin edir. Müəllif Quarkusun reaktiv tərəfi və ondan reaktiv və axın tətbiqləri yaratmaq üçün necə istifadə olunacağı haqqında danışır.

9. Eclipse MicroProfile-də Quarkus və sürətli proqram inkişafı

Müəllif: John Clingan
Eclipse MicroProfile və Quarkus-u birləşdirərək, tərtibatçılar onlarla millisaniyə ərzində işə salınan tam xüsusiyyətli konteynerləşdirilmiş MicroProfile proqramları yarada bilərlər. Videoda Kubernetes platformasında yerləşdirmə üçün konteynerləşdirilmiş MicroProfile tətbiqinin necə kodlaşdırılması haqqında ətraflı məlumat verilir.

10. Java, "Turbo" versiyası

Müəllif: Marcus Biel
Müəllif, xüsusilə serversiz mühitlərdə real irəliləyişlərə imkan verən super kiçik, super sürətli Java konteynerləri yaratmaq üçün Quarkus-dan necə istifadə olunacağını göstərir.



Mənbə: www.habr.com

Добавить комментарий