Bună ziua, colegi.
Astăzi vă prezentăm traducerea articolului lui Tugberk Ugurlu, care a încercat să expună într-un volum relativ mic principiile de proiectare ale sistemelor software moderne. Iată ce ne spune autorul despre sine în termeni concisi:

Fiind imposibil să abordăm în detaliu o temă atât de vastă precum modele arhitecturale + modele de proiectare conform stării din 2019, recomandăm nu doar textul domnului Ugurlu, ci și numeroasele linkuri pe care acesta le-a inclus. Dacă vă place – vom publica și un text mai specializat despre proiectarea sistemelor distribuite.

Fotografie de pe Unsplash
Dacă nu ați avut niciodată de-a face cu provocări precum proiectarea unui sistem software de la zero, atunci, atunci când începeți o astfel de muncă, uneori nu este clar de unde să începeți. Consider că, mai întâi, trebuie să conturați limitele, pentru a avea o idee mai clară despre ce anume intenționați să proiectați, și apoi – să vă apucați de treabă, fără a depăși aceste limite. Ca punct de plecare, puteți lua un produs sau un serviciu (ideal, unul pe care îl apreciați foarte mult) și să studiați implementarea acestuia. Este posibil să fiți surprinși de cât de simplu pare acest produs și de complexitatea imensă care se află în spatele lui. Nu uitați: , și asta este normal.
Cred că cel mai bun sfat pe care îl pot oferi celor care încep să proiecteze un sistem este acesta: nu faceți niciun fel de presupuneri! De la bun început, trebuie să clarificați faptele cunoscute despre acest sistem și așteptările legate de acesta. Iată câteva întrebări bune, la care răspunsurile vă vor ajuta să începeți proiectarea:
- Care este problema pe care încercăm să o rezolvăm?
- Care este numărul maxim de utilizatori care vor interacționa cu sistemul nostru?
- Ce modele de scriere și citire a datelor ne vor fi utilizate?
- Care sunt cazurile de defecțiune anticipate și cum ne propunem să le gestionăm?
- Ce așteptări există în ceea ce privește consistența și disponibilitatea sistemului?
- Trebuie să ținem cont de cerințele legate de verificarea externă și reglementare în activitate?
- Ce tipuri de date confidențiale intenționăm să stocăm?
Acestea sunt doar câteva întrebări care mi-au fost utile atât mie, cât și echipelor în care am avut ocazia să colaborez de-a lungul carierei mele profesionale. Dacă cunoașteți răspunsurile la aceste întrebări (și la orice altele relevante în contextul în care lucrați), puteți începe să aprofundați detaliile tehnice ale sarcinii.
Stabilim nivelul de bază
Ce înțeleg prin „nivel de bază”? În zilele noastre, majoritatea problemelor din industria software-ului pot fi rezolvate folosind metode și tehnologii existente. Așadar, navigând în acest peisaj, beneficiați de un anumit avantaj, întâlnind sarcini care au fost rezolvate de alții înaintea dumneavoastră. Să nu uităm că programele sunt scrise pentru a rezolva problemele afacerilor și utilizatorilor, de aceea ne străduim să abordăm sarcinile într-un mod cât mai direct și simplu (din perspectiva utilizatorului). De ce este important de reținut acest lucru? Poate în sistemul dumneavoastră vă place să căutați soluții unice pentru fiecare problemă, deoarece considerați că „cum aș fi eu programator dacă respect tiparele peste tot”? De fapt, arta constă în a lua decizii despre unde și ce trebuie făcut. Evident, tuturor ne apare din când în când să ne confruntăm cu probleme unice, fiecare fiind o adevărată provocare. Totuși, dacă nivelul nostru de bază este bine definit, știm pe ce să ne concentrăm: pe căutarea soluțiilor deja existente pentru sarcina în față sau pe explorarea și înțelegerea mai profundă a acesteia.
Cred că am reușit să vă conving că, dacă un specialist înțelege bine care sunt componentele arhitecturale ale unor sisteme software remarcabile, aceste cunoștințe vor fi esențiale pentru a stăpâni arta arhitectului și a dezvolta o bază solidă în acest domeniu.
Bine, cu ce să începem? La are un repository pe GitHub numit , din materialele căruia veți putea învăța despre proiectarea sistemelor la scară largă și vă veți pregăti pentru interviuri pe această temă. În repository există o secțiune cu exemple , unde, în special, este discutat modul în care anumite companii bine cunoscute abordează designul sistemelor lor . Cu toate acestea, înainte de a trece la acest material, haideți să analizăm în detaliu cele mai importante provocări arhitecturale cu care ne confruntăm în practică. Acest lucru este important, deoarece trebuie să definim O MULȚIME de aspecte ale unei probleme complexe și multilaterale și apoi să o rezolvăm în cadrul reglementărilor aplicabile în acest sistem.
Jackson Gabbard un video de 50 de minute despre interviuri axate pe proiectarea sistemelor un rezumat Dezvoltați cunoștințe despre stocarea și extragerea datelor
În general, decizia dumneavoastră cu privire la modul în care veți stoca pe termen lung și extrage datele dvs. are un impact critic asupra performanței sistemului. Prin urmare, trebuie să înțelegeți mai întâi caracteristicile așteptate ale scrierii și citirii datelor în sistemul dumneavoastră. Apoi trebuie să fiți capabil să evaluați aceste indicatori și să luați decizii bazate pe evaluările realizate. Cu toate acestea, puteți face față eficient acestei sarcini doar dacă înțelegeți tiparele existente de stocare a datelor. În principiu, acest lucru implică cunoștințe ferme legate de
selectarea bazei de date .
Redis – este un server de structuri de date care suportă diferite tipuri de valori. Permite lucrul cu structuri de date precum liste și mulțimi, citind datele folosind algoritmi bine cunoscuți, de exemplu, , organizând această activitate într-un mod durabil și cu accesibilitate ridicată.

Fotografie de pe Unsplash
Când te-ai familiarizat suficient cu diferitele modele de stocare a datelor – poți trece la studiul coerenței și disponibilității datelor. În primul rând, va trebui să înveți cel puțin în linii mari și apoi să îți perfecționezi aceste cunoștințe, analizând în detaliu modelele consacrate de și . Astfel, îți vei lărgi orizonturile în acest domeniu și vei înțelege că citirea și scrierea datelor sunt, de fapt, două probleme foarte diferite, fiecare având propriile provocări specifice. Dotat cu câteva modele de asigurare a coerenței și disponibilității, vei putea să îți crești semnificativ performanța sistemului, garantând în același timp un flux neîntrerupt de date către aplicațiile tale.
În final, încheind discuția despre problemele stocării datelor, ar fi bine să menționăm și despre caching. Ar trebui să se efectueze simultan atât pe client, cât și pe server? Ce date vor fi păstrate în cache? Și de ce? Cum îți vei organiza invalidarea cache-ului? Se va face aceasta în mod regulat, la intervale de timp determinate? Dacă da, cât de des? Îți recomand să abordezi aceste teme începând cu a menționatului ghid pentru proiectarea sistemelor.
Modelele de comunicație
Sistemele sunt compuse din diferite componente; acestea pot fi fie procese diferite, care funcționează în același nod fizic, fie mașini diferite, care acționează în părți diferite ale rețelei tale. Unele dintre aceste resurse din cadrul rețelei tale pot fi private, dar altele trebuie să fie publice și accesibile consumatorilor care se conectează la ele din exterior.
Este necesar să se asigure comunicarea între aceste resurse și, de asemenea, schimbul de informații între întregul sistem și lumea exterioară. În contextul proiectării sistemelor, aici ne confruntăm din nou cu un set de noi provocări unice. Să analizăm în ce măsură sunt utile , și care sunt r.

Fotografie de pe Unsplash
Atunci când se organizează comunicarea cu lumea exterioară, este întotdeauna foarte important , la asigurarea căreia trebuie de asemenea să ne apropiem cu seriozitate și să ne ocupăm activ.
Distribuirea conexiunilor
Nu sunt sigur că desprinderea acestui subiect într-o secțiune separată va părea justificată de toți. Cu toate acestea, voi expune detaliat acest concept aici, și consider că materialul acestei secțiuni este cel mai bine descris prin termenul „distribuire a conexiunilor” (connection distribution).
Sistemele sunt formate prin conectarea corectă a numeroaselor componente, iar comunicarea acestora este adesea organizată pe baza protocoalelor stabilite, cum ar fi TCP și UDP. Cu toate acestea, aceste protocoale, în sine, adesea nu sunt suficiente pentru a satisface toate nevoile sistemelor moderne, care sunt adesea supuse unor sarcini ridicate și depind semnificativ de nevoile utilizatorilor. Adesea este necesar să se găsească modalități de distribuire a conexiunilor pentru a face față acestor sarcini mari în sistem.
La baza acestei distribuiri se află un sistem bine cunoscut (DNS). Acest sistem permite transformarea unui nume de domeniu, de exemplu, algoritmul ciclic ponderat (weighted round robin) și metodele bazate pe întârzieri, care ajută la distribuirea sarcinii.
este esențială, și practic orice sistem mare de pe internet cu care avem de-a face astăzi se află în spatele unuia sau mai multor echilibratoare de încărcare. Echilibratoarele de sarcină ajută la distribuirea cererilor clienților între numeroase instanțe disponibile. Echilibratoarele de sarcină pot fi atât hardware, cât și software, însă, în practică, mai des avem de-a face cu cele software, cum ar fi și . sunt conceptual de asemenea foarte asemănătoare cu echilibratoarele de încărcare, deși între primele și celelalte există o serie de . Aceste diferențe trebuie luate în considerare atunci când se proiectează un sistem care să răspundă nevoilor tale.
De asemenea, este important să se știe despre (CDN). CDN este o rețea globală distribuită de servere proxy care livrează informații din nodurile care sunt geografic mai aproape de un utilizator specific. Rețelele CDN sunt preferabile atunci când lucrați cu fișiere statice scrise în JavaScript, CSS și HTML. În plus, serviciile cloud care oferă gestionare a traficului, precum , asigurându-vă distribuție globală și latențe reduse în lucrul cu conținut dinamic. Totuși, astfel de servicii sunt de obicei utile în cazurile în care lucrați cu servicii web fără păstrarea stării.
Să discutăm despre logica de afaceri. Structurarea logicei de afaceri, fluxurilor de sarcini și componentelor
Deci, am reușit să discutăm despre diversele aspecte infrastructurale ale sistemului. Cel mai probabil, utilizatorul nici nu se gândește la toate aceste elemente ale sistemului dumneavoastră și, sincer, nu îi pasă deloc de acestea. Ce-l interesează pe utilizator este cum interacționează cu sistemul dumneavoastră, ce poate realiza acționând în acest fel, precum și cum execută sistemul comenzile utilizatorului, ce face și cum prelucrează datele utilizatorului.
După cum este evident din titlul acestui articol, intenționam să discut despre arhitectura software-ului și proiectarea sistemelor. Prin urmare, nu planificam să acopăr modelele de proiectare software care descriu cum se creează componentele software. Totuși, cu cât mai mult reflectez asupra acestui subiect, cu atât mai mult îmi dau seama că granița dintre modelele de proiectare software și modelele arhitecturale este foarte neclară, iar cele două concepte sunt strâns legate. Să luăm, de exemplu, (event sourcing). Odată ce ați adoptat acest model arhitectural - va influența practic toate aspectele sistemului dumneavoastră: stocarea pe termen lung a datelor, nivelul de consistență acceptat în sistemul dumneavoastră, contururile componentelor din acesta etc. De aceea, am decis să menționez câteva modele arhitecturale care se referă direct la logica de afaceri. Chiar dacă în acest articol voi trebui să mă limitez la o simplă listă, vă recomand să vă familiarizați cu ea și să reflectați asupra ideilor legate de aceste modele. Iată, vă rog:
- Concepții , în special, ,
Abordări colaborative
Este extrem de puțin probabil să fiți acel participant al proiectului care răspunde exclusiv de procesul de proiectare a sistemului. Dimpotrivă, este mai probabil să interacționați cu colegii, atât în cadrul sarcinii dumneavoastră, cât și în afara sa. În acest caz, va trebui să evaluați soluțiile tehnologice alese împreună cu colegii, să identificați nevoile de afaceri și să înțelegeți cum să desfășurați cel mai bine sarcinile.

Fotografie de pe Unsplash
În primul rând, este necesar să dezvoltați o viziune clară și acceptată în mod comun asupra obiectivului de afaceri pe care încercați să-l atingeți și asupra aspectelor în mișcare cu care va trebui să lucrați. Tehnici de modelare în grup, în special, (event storming) ajută semnificativ la accelerarea acestui proces și vă îmbunătățesc șansele de succes. Această activitate poate fi realizată înainte sau după ce ați conturat , și apoi să le îmbunătățiți pe măsură ce produsul se dezvoltă. Bazându-vă pe nivelul de consens care va fi atins aici, puteți formula pentru acel context restrâns în care lucrați. Când va fi necesar să discutați despre arhitectura sistemului dumneavoastră, modelul C4 Simon Brown Probabil că în această zonă există și alte tehnologii mature, la fel de utile ca și proiectarea orientată pe obiecte. Totuși, revenim la înțelegerea domeniului, astfel că cunoștințele și experiența în domeniul
proiectării orientate pe obiecte Lansarea bibliotecii multimedia SDL 2.0.10
Sursa: habr.com
