NGINX-dən müasir proqramların işlənib hazırlanması prinsipləri. 1-ci hissə

Salam dostlar. Kursun başlaması ərəfəsində "PHP-də backend developer", ənənəvi olaraq faydalı materialın tərcüməsini sizinlə paylaşırıq.

Proqram təminatı getdikcə daha çox gündəlik problemləri həll etməklə yanaşı, getdikcə mürəkkəbləşir. Bir dəfə Mark Andreessenin dediyi kimi, dünyanı yeyir.

NGINX-dən müasir proqramların işlənib hazırlanması prinsipləri. 1-ci hissə

Nəticədə, son bir neçə il ərzində tətbiqlərin işlənib hazırlanması və çatdırılma üsulu kəskin şəkildə dəyişdi. Bunlar bir sıra prinsiplərlə nəticələnən tektonik miqyasda yerdəyişmələr idi. Bu prinsiplər komandanın qurulmasında, proqramınızın dizaynında, işlənib hazırlanmasında və son istifadəçilərə çatdırılmasında faydalı olduğunu sübut etdi.

Prinsipləri aşağıdakı kimi ümumiləşdirmək olar: proqram kiçik, veb-əsaslı və tərtibatçı mərkəzli arxitekturaya malik olmalıdır. Bu üç prinsip üzərində quraraq, siz tez və təhlükəsiz şəkildə son istifadəçiyə çatdırıla bilən, asanlıqla miqyaslana bilən və genişləndirilə bilən möhkəm, uçdan-uca tətbiq yarada bilərsiniz.

NGINX-dən müasir proqramların işlənib hazırlanması prinsipləri. 1-ci hissə

Təklif olunan prinsiplərin hər birinin bir sıra aspektləri var ki, biz hər bir prinsipin saxlanması və istifadəsi asan olan etibarlı proqramları tez bir zamanda çatdırmaq kimi son məqsədə necə töhfə verdiyini göstərmək üçün müzakirə edəcəyik. “İstifadə etdiyinizə əmin olun” deməyin nə demək olduğunu aydınlaşdırmaq üçün onların əksləri ilə müqayisədə prinsiplərə baxacağıq. kiçiklik prinsipi.

Ümid edirik ki, bu məqalə sizi daim böyüyən texnologiya yığını kontekstində vahid dizayn yanaşmasını təmin edəcək müasir proqramların qurulması üçün təklif olunan prinsiplərdən istifadə etməyə təşviq edəcək.

Bu prinsipləri tətbiq etməklə, siz proqram təminatının hazırlanmasında ən son tendensiyalardan, o cümlədən proqram təminatının inkişafından faydalandığınızı görəcəksiniz DevOps proqramların hazırlanması və çatdırılması, konteynerlərin istifadəsi (məsələn, yükvuran) və konteyner orkestrləşdirmə çərçivələri (məsələn, Kubernetes), mikroservislərdən istifadə (o cümlədən Microservice Architecture NGINX и şəbəkə rabitə arxitekturası mikroservis proqramları üçün.

Müasir proqram nədir?

Müasir tətbiqlər? Müasir yığın? "Müasir" tam olaraq nə deməkdir?

Əksər tərtibatçılar müasir tətbiqetmənin nədən ibarət olduğuna dair yalnız əsas anlayışa malikdirlər, ona görə də bu anlayışı dəqiq müəyyənləşdirmək lazımdır.

Müasir proqram çoxlu müştərini dəstəkləyir, istər React JavaScript kitabxanasından istifadə edən istifadəçi interfeysi, istər Android və ya iOS üçün mobil proqram, istərsə də API vasitəsilə digərinə qoşulan proqram. Müasir bir tətbiq məlumat və ya xidmətlər təqdim etdiyi qeyri-müəyyən sayda müştəriləri nəzərdə tutur.

Müasir proqram tələb olunan məlumat və xidmətlərə daxil olmaq üçün API təmin edir. API dəyişməz və sabit olmalıdır və xüsusi müştərinin xüsusi sorğusu üçün yazılmayıb. API HTTP(S) üzərində mövcuddur və GUI və ya CLI-də olan bütün funksiyalara girişi təmin edir.

Məlumat JSON kimi ümumi, qarşılıqlı işləyə bilən formatda mövcud olmalıdır. API obyektləri və xidmətləri aydın, mütəşəkkil formada nümayiş etdirir; məsələn, RESTful API və ya GraphQL layiqli interfeys təmin edir.

Müasir proqramlar müasir stek üzərində qurulur və müasir stek müvafiq olaraq belə proqramları dəstəkləyən stekdir. Bu yığın tərtibatçıya asanlıqla HTTP interfeysi və aydın API son nöqtələri ilə proqram yaratmağa imkan verir. Seçdiyiniz yanaşma tətbiqinizə JSON formatında məlumatları asanlıqla qəbul etməyə və göndərməyə imkan verəcək. Başqa sözlə, müasir stek on iki faktorlu tətbiqin elementlərinə uyğundur mikroservislər.

Bu tip yığının məşhur versiyaları əsaslanır Java, Python, Düyün, yaqut, PHP и Go. Mikroservis arxitekturası NGINX qeyd olunan dillərin hər birində həyata keçirilən müasir stek nümunəsidir.

Nəzərə alın ki, biz sırf mikroservis yanaşmasını müdafiə etmirik. Bir çoxunuz təkamülə ehtiyacı olan monolitlərlə işləyir, digərləri isə mikroservis proqramlarına çevrilmək üçün genişlənən və inkişaf edən SOA proqramları ilə məşğul olursunuz. Digərləri serversiz proqramlara doğru irəliləyir, bəziləri isə yuxarıdakıların birləşmələrini həyata keçirir. Bu məqalədə qeyd olunan prinsiplər bu sistemlərin hər birinə yalnız bir neçə kiçik dəyişikliklə tətbiq edilir.

Prinsipləri

Müasir tətbiqin və müasir yığının nə olduğu barədə əsas anlayışımız olduğuna görə, müasir tətbiqin dizaynında, həyata keçirilməsində və saxlanmasında sizə yaxşı xidmət edəcək memarlıq və dizayn prinsiplərinə nəzər salmağın vaxtıdır.

Prinsiplərdən biri “kiçik proqramlar yaratmaq”dır, gəlin onu deyək kiçiklik prinsipi. Çoxlu hərəkət edən hissələri olan inanılmaz dərəcədə mürəkkəb proqramlar var. Öz növbəsində, kiçik, diskret komponentlərdən proqram qurmaq, ümumilikdə dizaynı, saxlanmasını və istifadəsini asanlaşdırır. (Qeyd edək ki, biz “sadə edir” deyil, “sadə edir” dedik).

İkinci prinsip ondan ibarətdir ki, biz onların inkişaf etdirdikləri xüsusiyyətlərə diqqətini cəmləməyə kömək etməklə, onları tətbiq zamanı infrastruktur və CI/CD ilə bağlı narahatçılıqdan azad etməklə tərtibatçının məhsuldarlığını artıra bilərik. Beləliklə, bir sözlə, yanaşmamız developer yönümlü.

Nəhayət, tətbiqinizlə bağlı hər şey şəbəkəyə qoşulmalıdır. Son 20 il ərzində biz şəbəkəli gələcəyə doğru xeyli irəliləmişik, çünki şəbəkələr daha sürətli və tətbiqlər daha mürəkkəbləşmişdir. Artıq gördüyümüz kimi, müasir proqram bir çox müxtəlif müştərilər tərəfindən şəbəkədə istifadə edilməlidir. Şəbəkə təfəkkürünün arxitekturaya tətbiqi yaxşı uyğun gələn əhəmiyyətli üstünlüklərə malikdir kiçiklik prinsipi və yanaşma konsepsiyası, developer yönümlü.

Tətbiq hazırlayarkən və həyata keçirərkən bu prinsipləri nəzərə alsanız, məhsulunuzun hazırlanması və çatdırılmasında fərqli üstünlüyə malik olacaqsınız.

Bu üç prinsipi daha ətraflı nəzərdən keçirək.

Kiçiklik prinsipi

İnsan beyni üçün böyük miqdarda məlumatı bir anda qəbul etmək çətindir. Psixologiyada idrak yükü termini yaddaşda məlumat saxlamaq üçün tələb olunan zehni səylərin ümumi miqdarına aiddir. Tərtibatçıların idrak yükünün azaldılması prioritet məsələdir, çünki onlar bütün tətbiqin hazırkı mürəkkəb modelini və inkişaf etdirilən xüsusiyyətləri öz başlarında saxlamaq əvəzinə problemin həllinə diqqət yetirə bilərlər.

NGINX-dən müasir proqramların işlənib hazırlanması prinsipləri. 1-ci hissə

Tətbiqlər aşağıdakı səbəblərə görə parçalanır:

  • Tərtibatçılara idrak yükünün azaldılması;
  • Testin sürətləndirilməsi və sadələşdirilməsi;
  • Tətbiqə dəyişikliklərin sürətli çatdırılması.


Tərtibatçıların idrak yükünü azaltmağın bir neçə yolu var və burada kiçiklik prinsipi işə düşür.

Beləliklə, idrak yükünü azaltmağın üç yolu:

  1. Yeni bir xüsusiyyət hazırlayarkən nəzərə almalı olduqları vaxt çərçivəsini azaldın - vaxt çərçivəsi nə qədər qısa olarsa, idrak yükü də bir o qədər az olar.
  2. Bir anda üzərində işləyən kodun miqdarını azaldın - daha az kod - daha az yük.
  3. Tətbiqinizdə artımlı dəyişikliklər etmək prosesini sadələşdirin.

Azaldılmış inkişaf müddətləri

Metodologiyanın olduğu dövrlərə qayıdaq waterfall inkişaf prosesi üçün standart idi və proqramın hazırlanması və ya yenilənməsi üçün altı aydan iki ilə qədər vaxt çərçivələri ümumi təcrübə idi. Tipik olaraq, mühəndislər əvvəlcə məhsul tələbləri (PRD), sistem istinad sənədi (SRD), arxitektura planı kimi müvafiq sənədləri oxuyur və bütün bunları kod yazdıqları bir idrak modelinə birləşdirməyə başlayırlar. Tələblər və buna görə də arxitektura dəyişdikcə, bütün komandanı koqnitiv modelin yeniləmələri haqqında məlumatlandırmaq üçün əhəmiyyətli səylər göstərilməli idi. Ən pis halda, bu yanaşma işi sadəcə iflic edə bilər.

Tətbiqlərin hazırlanması prosesində ən böyük dəyişiklik çevik metodologiyanın tətbiqi oldu. Metodologiyanın əsas xüsusiyyətlərindən biri agile - Bu, təkrarlanan inkişafdır. Bu da öz növbəsində mühəndislərin koqnitiv yükünün azalmasına gətirib çıxarır. İnkişaf qrupundan tətbiqi bir uzun dövrədə həyata keçirməsini tələb etmək əvəzinə, agile Bu yanaşma sizə tez bir zamanda sınaqdan keçirilə və yerləşdirilə bilən kiçik həcmli koda diqqət yetirməyə imkan verir, eyni zamanda rəy alırsınız. Tətbiqin koqnitiv yükü, böyük miqdarda spesifikasiya ilə altı aydan iki ilə qədər, böyük bir tətbiqin daha diffuz başa düşülməsini hədəfləyən iki həftəlik xüsusiyyət əlavə və ya dəyişikliyinə keçdi.

Diqqəti kütləvi tətbiqdən iki həftəlik sprintdə tamamlana bilən xüsusi kiçik xüsusiyyətlərə köçürmək, növbəti sprintdən birdən çox xüsusiyyətə baxmamaq əhəmiyyətli bir dəyişiklikdir. Bu, daim dalğalanan idrak yükünü azaltmaqla inkişaf məhsuldarlığını artırmağa imkan verdi.

Metodologiyada agile son tətbiqin orijinal konsepsiyanın bir qədər dəyişdirilmiş versiyası olacağı gözlənilir, buna görə də son inkişaf nöqtəsi mütləq birmənalı deyil. Yalnız hər bir xüsusi sprintin nəticələri aydın və dəqiq ola bilər.

Kiçik kod bazaları

Koqnitiv yükün azaldılmasında növbəti addım kod bazasını azaltmaqdır. Tipik olaraq, müasir proqramlar kütləvi xarakter daşıyır - möhkəm, korporativ proqram minlərlə fayldan və yüz minlərlə kod sətirindən ibarət ola bilər. Faylların təşkilindən asılı olaraq, kod və fayllar arasında əlaqələr və asılılıqlar açıq-aşkar ola bilər və ya olmaya da bilər. İstifadə olunan kitabxanalardan və sazlama vasitələrinin kitabxanalar/paketlər/modullar və istifadəçi kodu arasında nə qədər yaxşı fərqlənməsindən asılı olaraq hətta kodun icrasının özü də problemli ola bilər.

Tətbiq kodunun işlək zehni modelinin qurulması xeyli vaxt tələb edə bilər və bu, yenidən tərtibatçıya böyük bir idrak yükü qoyur. Bu, xüsusən də çoxlu kodun olduğu, funksional komponentlər arasında qarşılıqlı əlaqənin dəqiq müəyyən edilmədiyi və funksional sərhədlərə riayət edilmədiyi üçün diqqət obyektlərinin ayrılması çox vaxt bulanıq olan monolit kod bazalarına aiddir.

Mühəndislərin idrak yükünü azaltmağın təsirli yollarından biri mikroservis arxitekturasına keçməkdir. Mikroservis yanaşmasında hər bir xidmət bir funksiya dəstinə diqqət yetirir; xidmətin mənası adətən müəyyən edilir və başa düşüləndir. Xidmətin sərhədləri də aydındır - unutmayın ki, xidmətlə əlaqə API istifadə edərək həyata keçirilir, ona görə də bir xidmət tərəfindən yaradılan məlumat asanlıqla digərinə ötürülə bilər.

Digər xidmətlərlə qarşılıqlı əlaqə adətən bir neçə istifadəçi xidmətləri və REST kimi sadə və təmiz API zənglərindən istifadə edən bir neçə provayder xidmətləri ilə məhdudlaşır. Bu o deməkdir ki, mühəndisin idrak yükü ciddi şəkildə azalır. Ən böyük problem xidmətin qarşılıqlı əlaqə modelini və əməliyyatlar kimi şeylərin çoxsaylı xidmətlər arasında necə baş verdiyini başa düşməkdir. Nəhayət, mikroxidmətlərdən istifadə kodun miqdarını azaltmaqla, aydın xidmət sərhədlərini müəyyən etməklə və istifadəçi-provayder münasibətləri haqqında fikir verməklə koqnitiv yükü azaldır.

Kiçik artım dəyişiklikləri

Prinsipin son elementi bir az dəyişikliklərin idarə edilməsidir. Tərtibatçıların kod bazasına (hətta bəlkə də özlərinin köhnə kodlarına) baxıb “Bu, axmaqdır, biz bütün bunları yenidən yazmalıyıq” deməsi xüsusilə cəlbedicidir. Bəzən düzgün qərar olur, bəzən isə yox. O, qlobal model dəyişikliklərinin yükünü inkişaf komandasının üzərinə qoyur və bu da öz növbəsində böyük idrak yükü ilə nəticələnir. Mühəndislərin sprint zamanı edə biləcəkləri dəyişikliklərə diqqət yetirmələri daha yaxşıdır ki, tədricən də olsa, lazımi funksionallığı vaxtında tətbiq edə bilsinlər. Son məhsul əvvəlcədən planlaşdırılana bənzəməlidir, lakin müştərinin ehtiyaclarına uyğun olaraq bəzi dəyişikliklər və sınaqlarla.

Kodun böyük hissələrini yenidən yazarkən, dəyişikliyi tez çatdırmaq bəzən mümkün olmur, çünki digər sistem asılılıqları işə düşür. Dəyişikliklərin axınına nəzarət etmək üçün funksiyaların gizlədilməsindən istifadə edə bilərsiniz. Əsasən, bu o deməkdir ki, funksionallıq istehsalda var, lakin o, mühit dəyişən parametrləri (env-var) və ya hər hansı digər konfiqurasiya mexanizmi vasitəsilə mövcud deyil. Əgər kod bütün keyfiyyətə nəzarət proseslərindən keçibsə, o, gizli vəziyyətdə istehsala buraxıla bilər. Bununla belə, bu strategiya yalnız funksiya nəhayət işə salındıqda işləyir. Əks təqdirdə, o, yalnız kodu qarışdıracaq və inkişaf etdiricinin məhsuldar olması üçün öhdəsindən gəlməli olacağı idrak yükü əlavə edəcəkdir. Dəyişikliklərin idarə edilməsi və artımlı dəyişikliklərin özü tərtibatçıların idrak yükünü əlçatan səviyyədə saxlamağa kömək edir.

Mühəndislər hətta sadəcə əlavə funksionallıq tətbiq edərkən bir çox çətinlikləri dəf etməlidirlər. Rəhbərliyin komandadakı lazımsız iş yükünü azaltması ehtiyatlı olardı ki, o, funksionallığın əsas elementlərinə diqqət yetirsin. İnkişaf komandanıza kömək etmək üçün edə biləcəyiniz üç şey var:

  1. Metodologiyadan istifadə edin agile, komandanın əsas xüsusiyyətlərə diqqət yetirməli olduğu vaxt çərçivəsini məhdudlaşdırmaq.
  2. Tətbiqinizi bir neçə mikroservis kimi həyata keçirin. Bu, təqdim edilən xüsusiyyətlərin sayını məhdudlaşdıracaq və işləyərkən idrak yükünü ehtiva edən sərhədləri gücləndirəcəkdir.
  3. Böyük, çətin olanlara artımlı dəyişikliklərə üstünlük verin, kiçik kod hissələrini dəyişdirin. Dəyişikliklər əlavə edildikdən dərhal sonra görünməsə belə, onları həyata keçirmək üçün funksiyaların gizlədilməsindən istifadə edin.

Əgər işinizdə kiçiklik prinsipini tətbiq etsəniz, komandanız daha xoşbəxt olacaq, lazımi xüsusiyyətlərin çatdırılmasına daha yaxşı diqqət yetirəcək və keyfiyyət dəyişikliklərini daha tez həyata keçirəcək. Lakin bu o demək deyil ki, iş daha mürəkkəbləşə bilməz, bəzən, əksinə, yeni funksionallığın tətbiqi bir neçə xidmətin dəyişdirilməsini tələb edir və bu proses monolit arxitekturada oxşardan daha mürəkkəb ola bilər. Hər halda, yanaşmadan istifadənin faydaları bir az dəyərlidir.

Birinci hissənin sonu.

Tezliklə tərcümənin ikinci hissəsini dərc edəcəyik, lakin indi şərhlərinizi gözləyirik və sizi dəvət edirik açıq gün, bu gün saat 20.00-da baş tutacaq.

Mənbə: www.habr.com

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