Proqram Memarlığı və Sistem Dizaynı: Böyük Şəkil və Resurs Bələdçisi

Salam həmkarlar.

Bu gün müasir proqram sistemlərinin layihələndirilməsi prinsiplərini nisbətən kiçik həcmdə təsvir etməyi öhdəsinə götürən Tuğberk Uğurlunun məqaləsinin tərcüməsini nəzərinizə çatdırırıq. Müəllifin özü haqqında qısaca dediklərini təqdim edirik:

Proqram Memarlığı və Sistem Dizaynı: Böyük Şəkil və Resurs Bələdçisi
2019-cu ildən memarlıq naxışları+dizayn naxışları kimi nəhəng mövzunu habro məqaləsində işıqlandırmaq qətiyyən mümkün olmadığından, təkcə Uruqlunun özünün mətnini deyil, həm də onun lütflə daxil etdiyi çoxsaylı keçidləri tövsiyə edirik. Əgər bəyənsəniz, paylanmış sistemlərin dizaynı haqqında daha yüksək ixtisaslaşmış mətn dərc edəcəyik.

Proqram Memarlığı və Sistem Dizaynı: Böyük Şəkil və Resurs Bələdçisi

Anlık görüntü İsaak Smit Unsplash-dan

Əgər siz heç vaxt proqram sistemini sıfırdan layihələndirmək kimi çətinliklərlə üzləşməmisinizsə, o zaman belə işə başlayarkən bəzən haradan başlamaq lazım olduğu belə aydın olmur. İnanıram ki, siz ilk növbədə sərhədlər çəkməlisiniz ki, tam olaraq nə dizayn edəcəyiniz barədə az-çox inamlı bir fikrə sahibsiniz, sonra qollarınızı çırmalayıb bu sərhədlər daxilində işləməlisiniz. Başlanğıc nöqtəsi olaraq, bir məhsul və ya xidməti (ideal olaraq həqiqətən bəyəndiyiniz) götürə və onu necə həyata keçirəcəyinizi anlaya bilərsiniz. Bu məhsulun nə qədər sadə göründüyünə və əslində nə qədər mürəkkəblik ehtiva etdiyinə heyran ola bilərsiniz. Unutma: sadə - adətən mürəkkəb, və bu yaxşıdır.

Məncə, sistem dizayn etməyə başlayan hər kəsə verə biləcəyim ən yaxşı məsləhət budur: heç bir fərziyyə irəli sürməyin! Əvvəldən bu sistem haqqında məlum olan faktları və onunla bağlı gözləntiləri dəqiqləşdirməlisiniz. Dizaynınıza başlamağınıza kömək etmək üçün soruşa biləcəyiniz bəzi yaxşı suallar bunlardır:

  • Həll etməyə çalışdığımız problem nədir?
  • Sistemimizlə əlaqə saxlayacaq istifadəçilərin pik sayı nə qədərdir?
  • Məlumatların yazılması və oxunması üçün hansı nümunələrdən istifadə edəcəyik?
  • Gözlənilən uğursuzluq halları hansılardır, onları necə həll edəcəyik?
  • Sistemin ardıcıllığı və əlçatanlığı ilə bağlı gözləntilər nələrdir?
  • İşləyərkən kənar yoxlama və tənzimləmə ilə bağlı hər hansı tələbləri nəzərə almalısınız?
  • Hansı növ həssas məlumatları saxlayacağıq?

Bunlar həm mənim, həm də peşəkar fəaliyyət illərimdə iştirak etdiyim komandalar üçün faydalı olan bir neçə sualdır. Bu sualların cavablarını (və işləməli olduğunuz kontekstə uyğun olan digərlərini) bilirsinizsə, o zaman problemin texniki detallarını tədricən araşdıra bilərsiniz.

İlkin səviyyəni təyin edin

Burada “əsas xətt” dedikdə nəyi nəzərdə tuturam? Əslində, bizim dövrümüzdə proqram sənayesindəki problemlərin əksəriyyəti mövcud metod və texnologiyalardan istifadə etməklə “həll edilə bilər”. Müvafiq olaraq, bu mənzərəni seyr etməklə, sizdən əvvəl başqasının həll etməli olduğu problemlərlə qarşılaşdığınız zaman müəyyən bir başlanğıc əldə edirsiniz. Unutmayın ki, proqramlar biznes və istifadəçi problemlərini həll etmək üçün yazılır, ona görə də biz problemi ən sadə və sadə (istifadəçi nöqteyi-nəzərindən) həll etməyə çalışırıq. Bunu xatırlamaq niyə vacibdir? Bəlkə koordinat sisteminizdə bütün problemlər üçün unikal həll yolları axtarmağı xoşlayırsınız, çünki “hər yerdə nümunələrə əməl etsəm mən necə proqramçıyam” deyə düşünürsünüz? Faktiki olaraq, burada sənət harada və nə edəcəyinə dair qərarlar verir. Təbii ki, hər birimiz zaman-zaman özünəməxsus problemlərlə qarşılaşmalı oluruq ki, bunların hər biri əsl problemdir. Bununla belə, əgər ilkin səviyyəmiz aydın şəkildə müəyyən edilibsə, o zaman biz enerjimizi nəyə sərf edəcəyimizi bilirik: qarşımıza qoyulan problemin həlli üçün hazır variantları axtarmaq və ya onu daha da öyrənmək və daha dərindən dərk etmək.

Düşünürəm ki, sizi inandıra bildim ki, əgər mütəxəssis bəzi gözəl proqram sistemlərinin arxitektura komponentinin nədən ibarət olduğunu inamla başa düşsə, onda bu biliklər memar sənətinə yiyələnmək və bu sahədə möhkəm zəmin yaratmaq üçün əvəzsiz olacaqdır.

Yaxşı, haradan başlamaq lazımdır? U Donna Martina GitHub-da adlı bir depo var sistem-dizayn-primer, ondan geniş miqyaslı sistemlərin dizaynını öyrənə, həmçinin bu mövzuda müsahibələrə hazırlaşa bilərsiniz. Anbarda nümunələr olan bir bölmə var real memarlıqlar, burada, xüsusilə, onların sistemlərinin dizaynına necə yanaşdıqları nəzərə alınır bəzi tanınmış şirkətlərməsələn, Twitter, Uber və s.

Bununla belə, bu materiala keçməzdən əvvəl, praktikada qarşılaşdığımız ən mühüm memarlıq problemlərinə daha yaxından nəzər salaq. Bu vacibdir, çünki siz inadkar və çoxşaxəli problemin ÇOX aspektlərini dəqiqləşdirməli və sonra onu müəyyən sistemdə qüvvədə olan qaydalar çərçivəsində həll etməlisiniz. Cekson Qabbard, keçmiş Facebook əməkdaşı yazıb Sistem dizaynı ilə bağlı müsahibələr haqqında 50 dəqiqəlik video, burada o, yüzlərlə ərizəçinin yoxlanılması təcrübəsini bölüşdü. Video böyük sistem dizaynına və belə bir vəzifəyə namizəd axtararkən vacib olan uğur meyarlarına diqqət yetirsə də, sistemlərin dizaynı zamanı ən vacib olan şeylər haqqında hərtərəfli mənbə rolunu oynayacaq. Mən də təklif edirəm xülasə bu video.

Məlumatların saxlanması və əldə edilməsi ilə bağlı bilikləri inkişaf etdirin

Bir qayda olaraq, məlumatlarınızı uzun müddət ərzində necə saxlamağınız və əldə etməyinizlə bağlı qərarınız sistemin işinə kritik təsir göstərir. Buna görə də, ilk növbədə sisteminizin gözlənilən yazma və oxu xüsusiyyətlərini başa düşməlisiniz. Sonra bu göstəriciləri dəyərləndirməyi bacarmalı və edilən qiymətləndirmələrə əsasən seçim edə bilməlisiniz. Bununla belə, yalnız mövcud məlumat saxlama nümunələrini başa düşsəniz, bu işin öhdəsindən səmərəli şəkildə gələ bilərsiniz. Prinsipcə, bu, əlaqəli möhkəm bilikləri nəzərdə tutur verilənlər bazası seçimi.

Verilənlər bazaları son dərəcə genişlənən və davamlı olan məlumat strukturları kimi düşünülə bilər. Buna görə də, müəyyən bir verilənlər bazası seçərkən məlumat strukturları haqqında bilik sizin üçün çox faydalı olmalıdır. Misal üçün, Redis müxtəlif növ dəyərləri dəstəkləyən məlumat strukturu serveridir. Bu, siyahılar və dəstlər kimi məlumat strukturları ilə işləməyə və tanınmış alqoritmlərdən istifadə edərək məlumatları oxumağa imkan verir, məsələn, LRU, bu cür işlərin davamlı və yüksək əlçatan üslubda təşkili.

Proqram Memarlığı və Sistem Dizaynı: Böyük Şəkil və Resurs Bələdçisi

Anlık görüntü Samuel Zeller Unsplash-dan

Müxtəlif məlumat saxlama nümunələri haqqında kifayət qədər anlayışınız olduqdan sonra məlumatların ardıcıllığı və mövcudluğunun öyrənilməsinə keçin. Hər şeydən əvvəl başa düşmək lazımdır CAP teoremi heç olmasa ümumi mənada və sonra qurulmuş nümunələrə daha yaxından nəzər salaraq bu biliyi cilalayın ardıcıllıq и əlçatanlıq. Bu yolla, siz sahəni başa düşəcəksiniz və məlumatların oxunması və yazılması əslində hər birinin özünəməxsus problemləri olan iki fərqli problem olduğunu başa düşəcəksiniz. Bir neçə ardıcıllıq və əlçatanlıq nümunələri ilə silahlanmış, proqramlarınıza düzgün məlumat axınını təmin etməklə yanaşı, sistemin performansını əhəmiyyətli dərəcədə artıra bilərsiniz.

Nəhayət, məlumatların saxlanması problemləri ilə bağlı söhbəti yekunlaşdıraraq, keşləməni də qeyd etməliyik. Müştəri və serverdə eyni vaxtda işləməlidirmi? Keşinizdə hansı məlumatlar olacaq? Bəs niyə? Keşin etibarsızlığını necə təşkil edirsiniz? Müntəzəm olaraq, müəyyən fasilələrlə ediləcəkmi? Əgər belədirsə, nə qədər tez-tez? Bu mövzuları öyrənməyə başlamağı tövsiyə edirəm növbəti bölmə yuxarıda qeyd olunan sistem dizayn primeri.

Ünsiyyət Nümunələri

Sistemlər müxtəlif komponentlərdən ibarətdir; bunlar eyni fiziki node daxilində işləyən müxtəlif proseslər və ya şəbəkənizin müxtəlif hissələrində işləyən müxtəlif maşınlar ola bilər. Şəbəkənizdəki bu resurslardan bəziləri şəxsi ola bilər, lakin digərləri açıq olmalıdır və onlara kənardan daxil olan istehlakçılar üçün açıq olmalıdır.

Bu resursların bir-biri ilə əlaqəsini, eləcə də bütün sistemlə xarici dünya arasında məlumat mübadiləsini təmin etmək lazımdır. Sistemlərin dizaynı kontekstində biz yenə də bir sıra yeni və unikal problemlərlə üzləşirik. Onların necə faydalı ola biləcəyini görək asinxron tapşırıq axınları, və nə sMüxtəlif ünsiyyət formaları mövcuddur.

Proqram Memarlığı və Sistem Dizaynı: Böyük Şəkil və Resurs Bələdçisi

Anlık görüntü Tony Stoddard Unsplash-dan

Xarici dünya ilə ünsiyyəti təşkil edərkən həmişə çox vacibdir təhlükəsizliktəmin edilməsinə də ciddi yanaşılmalı və fəal şəkildə davam etdirilməlidir.

Bağlantı paylanması

Əmin deyiləm ki, bu mövzunu ayrıca bölməyə yerləşdirmək hamıya haqlı görünəcək. Buna baxmayaraq, mən bu konsepsiyanı burada ətraflı şəkildə təqdim edəcəyəm və inanıram ki, bu bölmədəki material ən dəqiq şəkildə “əlaqə paylanması” termini ilə təsvir edilmişdir.

Sistemlər bir çox komponentləri düzgün birləşdirməklə formalaşır və onların bir-biri ilə əlaqəsi çox vaxt müəyyən edilmiş protokollar, məsələn, TCP və UDP əsasında təşkil edilir. Bununla belə, bu protokollar tez-tez yüksək yük altında işləyən və eyni zamanda istifadəçi ehtiyaclarından çox asılı olan müasir sistemlərin bütün ehtiyaclarını ödəmək üçün çox vaxt qeyri-kafi olur. Sistemdə belə yüksək yüklərin öhdəsindən gəlmək üçün tez-tez əlaqələri paylamaq yollarını tapmaq lazımdır.

Bu paylama tanınmış əsaslara əsaslanır domen adı sistemi (DNS). Belə bir sistem, yükün paylanmasına kömək etmək üçün çəkili dəyirmi sistem və gecikməyə əsaslanan üsullar kimi domen adının dəyişdirilməsinə imkan verir.

Yük balansı prinsipial olaraq vacibdir və bu gün məşğul olduğumuz hər bir böyük İnternet sistemi bir və ya bir neçə yük balanslayıcısının arxasında yerləşir. Yük balanslaşdırıcıları müştəri sorğularını çoxsaylı mövcud instansiyalar arasında paylamağa kömək edir. Yük balanslaşdırıcıları həm aparat, həm də proqram təminatında olur, lakin praktikada daha çox proqram təminatı ilə məşğul olmalısınız, məsələn HAProxy и ELB. Ters proksilər konseptual olaraq yük balanslaşdırıcılarına çox bənzəyir, baxmayaraq ki, birinci və ikinci arasında bir sıra var fərqli fərqlər. Ehtiyaclarınız əsasında sistem dizayn edərkən bu fərqlər nəzərə alınmalıdır.

haqqında da bilməlisən məzmun çatdırılması şəbəkələri (CDN). CDN, coğrafi cəhətdən müəyyən bir istifadəçiyə daha yaxın olan qovşaqlardan məlumat ötürən qlobal paylanmış proxy serverlər şəbəkəsidir. JavaScript, CSS və HTML-də yazılmış statik fayllarla işləsəniz, CDN-lərdən istifadə etmək daha məqsədəuyğundur. Bundan əlavə, bu gün trafik menecerlərini təmin edən bulud xidmətləri geniş yayılmışdır, məsələn, Azure Trafik Meneceri, dinamik məzmunla işləyərkən sizə qlobal paylama və azaldılmış gecikmə imkanı verir. Bununla belə, bu cür xidmətlər adətən vətəndaşlığı olmayan veb xidmətləri ilə işləməli olduğunuz hallarda faydalıdır.

Gəlin biznes məntiqindən danışaq. Biznes məntiqinin, tapşırıq axınlarının və komponentlərin strukturlaşdırılması

Beləliklə, biz sistemin müxtəlif infrastruktur aspektlərini müzakirə edə bildik. Çox güman ki, istifadəçi sisteminizin bütün bu elementləri haqqında düşünmür və düzünü desəm, onlara heç əhəmiyyət vermir. İstifadəçi sisteminizlə qarşılıqlı əlaqənin necə olması ilə maraqlanır, bunu etməklə nəyə nail olmaq olar, həmçinin sistemin istifadəçi əmrlərini necə yerinə yetirdiyi, istifadəçi məlumatları ilə nə və necə işlədiyi ilə maraqlanır.

Bu məqalənin adından da göründüyü kimi, mən proqram arxitekturası və sistem dizaynı haqqında danışacaqdım. Müvafiq olaraq, proqram komponentlərinin necə yaradıldığını təsvir edən proqram dizayn nümunələrini əhatə etməyi planlaşdırmadım. Bununla belə, bu barədə nə qədər çox düşünsəm, bir o qədər mənə elə gəlir ki, proqram dizayn nümunələri ilə memarlıq nümunələri arasındakı xətt çox bulanıqdır və bu iki anlayış bir-biri ilə sıx bağlıdır. Məsələn götürək hadisə qeydiyyatı (hadisə mənbəyi). Bu memarlıq nümunəsini qəbul etdikdən sonra o, sisteminizin demək olar ki, hər tərəfinə təsir edəcək: məlumatların uzunmüddətli saxlanması, sisteminizdə qəbul edilmiş ardıcıllıq səviyyəsi, onun tərkibindəki komponentlərin forması və s. və s.. Buna görə də, biznes məntiqinə birbaşa aid olan bəzi memarlıq nümunələrini qeyd etmək qərarına gəldim. Bu məqalə sadə bir siyahı ilə məhdudlaşmalı olsa da, mən sizi onunla tanış olmağa və bu nümunələrlə əlaqəli fikirlər üzərində düşünməyə dəvət edirəm. Buyurun:

Birgə yanaşmalar

Sistemin dizayn prosesinə yalnız cavabdeh olan iştirakçı kimi özünüzü bir layihədə tapmağınız çox az ehtimaldır. Əksinə, çox güman ki, həm işinizdə, həm də işinizdən kənarda işləyən həmkarlarınızla ünsiyyət qurmalı olacaqsınız. Bu halda, seçilmiş texnologiya həllərini həmkarlarınızla birlikdə qiymətləndirmək, biznes ehtiyaclarını müəyyən etmək və tapşırıqları necə paralelləşdirmək lazım olduğunu başa düşmək lazım ola bilər.

Proqram Memarlığı və Sistem Dizaynı: Böyük Şəkil və Resurs Bələdçisi

Anlık görüntü Kaleydiko Unsplash-dan

İlk addım, nail olmağa çalışdığınız biznes məqsədinin nə olduğu və hansı hərəkətli hissələrin öhdəsindən gəlməli olduğunuz barədə dəqiq və ümumi anlayışı inkişaf etdirməkdir. Xüsusilə qrup modelləşdirmə üsulları fırtına hadisələri (hadisə fırtınası) bu prosesi əhəmiyyətli dərəcədə sürətləndirməyə və uğur şansınızı artırmağa kömək edir. Bu iş konturdan əvvəl və ya sonra edilə bilər xidmətlərinizin sərhədləri, sonra məhsul yetişdikcə dərinləşdirin. Burada əldə ediləcək ardıcıllıq səviyyəsinə əsasən, siz də formalaşdıra bilərsiniz ümumi dil işlədiyiniz məhdud kontekst üçün. Sisteminizin arxitekturası haqqında danışmaq lazım olanda, onu faydalı tapa bilərsiniz model C4təklif etdi Simon Brown, xüsusən də problemin təfərrüatlarına nə qədər girməli olduğunuzu başa düşməyiniz lazım olduqda, ünsiyyət qurmaq istədiyiniz şeyləri vizuallaşdırmalısınız.

Yəqin ki, bu mövzuda Domain Driven Design-dan daha az faydalı olmayan başqa bir yetkin texnologiya var. Bununla belə, biz birtəhər mövzu sahəsini başa düşməyə qayıdırıq, buna görə də bu sahədə bilik və təcrübə Domenə əsaslanan dizayn sizin üçün faydalı olmalıdır.

Mənbə: www.habr.com

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