Arhitectura software și proiectarea sistemelor: imagine de ansamblu și ghid al resurselor

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:

Arhitectura software și proiectarea sistemelor: imagine de ansamblu și ghid al resurselor
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.

Arhitectura software și proiectarea sistemelor: imagine de ansamblu și ghid al resurselor

Fotografie de Isaac Smith 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: simplu – este de obicei complicat, ș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 Donna Martin are un repository pe GitHub numit system-design-primer, 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 de arhitecturi reale, unde, în special, este discutat modul în care anumite companii bine cunoscute abordează designul sistemelor lor de exemplu, Twitter, Uber, etc.. 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 , fost angajat Facebook, a realizatun video de 50 de minute despre interviuri axate pe proiectarea sistemelor , unde și-a împărtășit propria experiență în evaluarea a sute de candidați. Deși videoclipul se concentrează în mod clar pe proiectarea sistemelor mari și pe criteriile de succes importante în căutarea unui astfel de candidat, acesta va servi, totuși, ca un resursă cuprinzătoare despre lucrurile cele mai importante în proiectarea sistemelor. De asemenea, vă propunun rezumat al acestui videoclip. 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 Baze de date pot fi considerate structuri de date cu o scalabilitate și durabilitate excepționale. Prin urmare, cunoașterea structurilor de date ar trebui să vă fie foarte folositoare și în alegerea unei baze de date sau alteia. De exemplu,.

Redis 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, LRU, organizând această activitate într-un mod durabil și cu accesibilitate ridicată.

Arhitectura software și proiectarea sistemelor: imagine de ansamblu și ghid al resurselor

Fotografie Samuel Zeller 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 teorema CAP cel puțin în linii mari și apoi să îți perfecționezi aceste cunoștințe, analizând în detaliu modelele consacrate de coerență și disponibilitate. 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 următoarea secțiune 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 fluxurile de sarcini asincrone, și care sunt rmodele diverse de comunicare sunt disponibile.

Arhitectura software și proiectarea sistemelor: imagine de ansamblu și ghid al resurselor

Fotografie Tony Stoddard de pe Unsplash

Atunci când se organizează comunicarea cu lumea exterioară, este întotdeauna foarte important securitate, 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 sistemul de nume de domenii (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.

Încărcarea echilibrată 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 HAProxy și ELB. Serverele proxy inverse sunt conceptual de asemenea foarte asemănătoare cu echilibratoarele de încărcare, deși între primele și celelalte există o serie de diferențe distincte. 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 rețelele de livrare a conținutului (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 Azure Traffic Manager, 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, înregistrarea evenimentelor (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:

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.

Arhitectura software și proiectarea sistemelor: imagine de ansamblu și ghid al resurselor

Fotografie Kaleidico 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, brainstorming de evenimente (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 limitele serviciilor dumneavoastră, ș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 un limbaj comun pentru acel context restrâns în care lucrați. Când va fi necesar să discutați despre arhitectura sistemului dumneavoastră, modelul C4 , propus deSimon Brown , este deosebit de util, mai ales când trebuie să înțelegeți cât de mult trebuie să vă aprofundați în detalii, vizualizând lucrurile pe care doriți să le comunicați.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 vă vor fi de folos. Lansarea bibliotecii multimedia SDL 2.0.10

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster