Përshëndetje, kolegë.
Sot po ju paraqesim një përkthim të artikullit nga Tugberk Ugurlu, i cili ka marrë përsipër të përshkruajë në një volum relativisht të vogël parimet e projektimit të sistemeve software moderne. Ja çfarë thotë autori për veten në mënyrë të përmbledhur:

Duke qenë se është thjesht e pamundur të mbulosh një temë kaq kolosale si modelet arkitektonike + modelet e projektimit sipas gjendjes në vitin 2019, rekomandojmë jo vetëm tekstin e zotit Ugurlu, por edhe numrin e shumtë të lidhjeve që ai ka vendosur me mirësjellje në të. Nëse ju pëlqen – ne do të publikojmë edhe një tekst më specifik mbi projektimin e sistemeve të shpërndara.

Foto nga faqja Unsplash
Nëse keni hasur ndonjëherë në sfida të tilla si projektimi i një sistemi software nga e para, atëherë, kur filloni një punë të tillë, ndonjëherë nuk është e qartë se nga duhet të filloni. Unë besoj se fillimisht duhet të përshkruani kufijtë, në mënyrë që të keni një ide mëse të sigurt se çfarë saktësisht po planifikoni të projektoni, dhe më pas – të ngriheni në punë pa kaluar këto kufij. Si një pikë fillestare, mund të merrni ndonjë produkt ose shërbim (në mënyrë ideale – diçka që ju pëlqen shumë) dhe të shqyrtoni si është implementuar ai. Mund të habiteni nga sa e thjeshtë duket ky produkt dhe sa kompleksitet të madh fshihet në të. Mos harroni: , dhe kjo është normale.
Mendoj se këshilla më e mirë që mund t'i jap atyre që po fillojnë projektimin e sistemit është: mos bëni asnjë supozim! Që nga fillimi duhet saktësuar faktet e njohura rreth këtij sistemi dhe pritshmëritë që lidhen me të. Ja disa pyetje të mira, përgjigjet e të cilave do t'ju ndihmojnë të filloni projektimin:
- Cila është problemi që po përpiqemi të zgjidhim?
- Sa është numri maksimal i përdoruesve që do të ndërveprojnë me sistemin tonë?
- Cilat janë modelet e shkruarjes dhe leximit të të dhënave që do të përdoren?
- Cilat janë rastet e pritshme të dështimeve dhe si do të merremi me to?
- Çfarë pritshmërish ka për qëndrueshmërinë dhe disponueshmërinë e sistemit?
- A duhet të marrim parasysh ndonjë kërkesë të jashtme lidhur me auditimin dhe rregullimin?
- Cilat lloje të të dhënave konfidenciale do të ruajmë?
Këto janë disa pyetje që na ndihmuan si mua, ashtu edhe ekipet në të cilat kam marrë pjesë gjatë gjithë karrierës time profesionale. Nëse dini përgjigjet për këto pyetje (dhe për ndonjë tjetër që është relevante në kontekstin ku punoni), atëherë mund të thelloheni gradualisht në detajet teknike të problemit.
Vendosim nivelin fillestar
Çfarë kuptoj këtu me «nivelin fillestar»? Në fakt, në kohët tona shumica e problemeve në industrinë e softuerit "mund" të zgjidhen duke përdorur metodat dhe teknologjitë që tashmë ekzistojnë. Prandaj, duke u orientuar në këtë peizazh, merrni një avantazh të caktuar kur përballeni me detyra që dikush e ka zgjidhur para jush. Mos harroni se programet shkruhen për të zgjidhur problemet e biznesit dhe të përdoruesve, prandaj ne përpiqemi të zgjidhim problemin në mënyrën më të drejtpërdrejtë dhe më të thjeshtë (nga pikëpamja e përdoruesit). Pse është e nevojshme të mbahet mend kjo? Ndoshta, në sistemin tuaj koordinat, ju pëlqen të kërkoni zgjidhje unike për çdo problem, sepse mendoni, "cili jam unë si programues nëse ndjek modelet kudo"? Në të vërtetë, art i tillë përfshin marrjen e vendimeve se ku dhe çfarë të bëni. Sigurisht, të gjithëve na ndodh herë pas here të përballemi me probleme unike, të cilat janë një sfidë e vërtetë. Megjithatë, nëse niveli ynë fillestar është i qartë, atëherë dimë se për çfarë t'i përkushtojmë forcën: për të kërkuar zgjidhje të gatshme për problemin që na është paraqitur, apo për ta studiuar atë më tej dhe për ta kuptuar më thellë.
Mendoj se kam arritur t'ju bind që, nëse një specialist e kupton mirë arkitekturën e disa sistemeve të shkëlqyera softuerike, këto njohuri do të jenë të pazëvendësueshme në përvetësimin e artit të arkitektit dhe në ndërtimin e një baza të fortë në këtë fushë.
Mirë, nga ku të fillojmë? Në ka një repository në GitHub të quajtur , në bazë të materialeve të të cilit do të mësoni si të projektoni sisteme në shkallë të madhe, si dhe të përgatiteni për intervista në këtë temë. Në repository ka një seksion me shembuj , ku, sidomos, diskutohet se si qasen deri te dizajni i sistemeve të tyre , si Twitter, Uber, etj.
Megjithatë, para se të kalojmë në këtë material, le të shqyrtojmë më në detaje sfidat arkitektonike më të rëndësishme me të cilat përballet në praktikë. Kjo është e rëndësishme, pasi duhet të saktësosh SHUMË aspekte të problemit të ngurtë dhe shumëpranisë, dhe pastaj ta zgjidhësh atë brenda rregullat e caktuara që veprojnë në këtë sistem. , një ish-punonjës i Facebook, regjistroi , ku ndau përvojën e tij nga shqyrtimi i qindra kandidatëve. Megjithëse videoja është qartë e fokusuar në dizajnin e sistemeve të mëdha dhe kritereve të suksesit, të rëndësishme në gjetjen e një kandidati për një pozita të tillë, ajo do të shërbejë gjithashtu si një burim të plotë për atë se çfarë është më e rëndësishme në dizajnin e sistemeve. Po ashtu, ofroj e kësaj videoje.
Shkoni për të zhvilluar njohuritë mbi ruajtjen dhe nxjerrjen e të dhënave
Si zakonisht, vendimi juaj për mënyrën se si do ta ruani dhe nxirrni përherë të dhënat tuaja ka një ndikim kritik në performancën e sistemit. Prandaj, duhet të kuptoni fillimisht karakteristikat e pritura të regjistrimit dhe leximit të të dhënave në sistemin tuaj. Pastaj, duhet të jeni në gjendje të vlerësoni këto tregues dhe të bëni zgjedhje të bazuara në vlerësimet e bëra. Megjithatë, do të jeni në gjendje të përballoni këtë punë në mënyrë efektive vetëm nëse kuptoni modelet aktuale të ruajtjes së të dhënave. Në parim, kjo nënkupton njohuri të forta të lidhura me .
Baza e të dhënave mund të konsiderohet si struktura të dhënash me shtrirje dhe qëndrim të jashtëzakonshëm. Prandaj, njohuritë në lidhje me strukturat e të dhënave do t'ju ndihmojnë gjithashtu në zgjedhjen e një baze të dhënash të caktuar. Për shembull, – është një server i strukturave të të dhënave që mbështet lloje të ndryshme vlerash. Ai lejon punimin me struktura të tilla si lista dhe grupe, të lexoni të dhëna duke përdorur algoritme të njohura, si , duke organizuar këtë punë në një stil që është i qëndrueshëm dhe me akses të lartë.

Foto nga faqja Unsplash
Kur ju të keni një kuptim të mjaftueshëm të modeleve të ndryshme të ruajtjes së të dhënave, kaloni në studimin e qëndrueshmërisë dhe disponueshmërisë së të dhënave. Së pari, do t'ju nevojitet të mësoni pothuajse në përmasa të përgjithshme dhe më pas të rafinoni këtë dijeni duke shqyrtuar më në detaje modelet e konsoliduara dhe . Kështu do të merrni një panorama më të gjerë në këtë fushë dhe do të kuptoni se leximi dhe shkruajta e të dhënave janë vërtet dy probleme shumë të ndryshme, dhe çdonjëra prej tyre përballet me sfida të veçanta. Duke u armatosur me disa modele të sigurisë së qëndrueshmërisë dhe disponueshmërisë, do të jeni në gjendje të rritni ndjeshëm performancën e sistemit tuaj, duke garantuar një furnizim të pandërprerë të të dhënave në aplikacionet tuaja.
Së fundmi, duke përfunduar diskutimin mbi çështjet e ruajtjes së të dhënave, duhet të përmendim edhe për memorizimin. A duhet ai të realizohet njëkohësisht në klient dhe në server? Cilat të dhëna do të gjenden në memorizimin tuaj? Dhe përse? Si do ta organizoni invalidimin e memorizimit? A do të realizohet ajo rregullisht, në intervale të caktuara? Nëse po, sa shpesh? Rekomandoj që të filloni me përpunimin e këtyre temave nga librit të përmendur të dizajnit të sistemeve.
Modelet e komunikimit
Sistemet përbëhen nga komponente të ndryshme; këto mund të jenë si procese të ndryshme që punojnë brenda të njëjtit nod fizik, ashtu si dhe makina të ndryshme që veprojnë në pjesë të ndryshme të rrjetit tuaj. Disa nga këto burime brenda rrjetit tuaj mund të jenë private, por të tjerat duhet të jenë publike dhe të hapura për konsumatorët që u qasen nga jashtë.
Duhet të sigurohet komunikimi i këtyre burimeve me njëra-tjetrën, si dhe shkëmbimi i informacionit midis gjithë sistemit dhe botës jashtë. Në kontekstin e projektimit të sistemeve, këtu përballemi përsëri me një grup sfidash të reja dhe unike. Le të kuptojmë se si mund të jenë të dobishme , dhe çfarë janë.

Foto nga faqja Unsplash
Kur organizoni komunikimin me botën jashtë, gjithmonë është shumë e rëndësishme , për të cilën gjithashtu duhet të qaseni me të gjitha seriozitetin dhe ta trajtoni atë aktivisht.
Shpërndarja e lidhjeve
Nuk jam i sigurt se nxjerrja e kësaj teme në një seksion të veçantë do t'i duket e arsyeshme të gjithëve. Megjithatë, do ta paraqes këtë koncept në mënyrë të zgjeruar dhe mendoj se materiali i kësaj ndarjeje përshkruhet më saktë me termin «distribuimi i lidhjeve» (connection distribution).
Sistemet formohen duke lidhur sipas së drejtës shumë komponente, dhe komunikimi i tyre me njëri-tjetrin shpesh organizohet mbi baza protokolesh të vendosura, si TCP dhe UDP. Megjithatë, këto protokolle shpesh nuk janë të mjaftueshme për të plotësuar të gjitha nevojat e sistemeve moderne, të cilat shpesh operojnë nën ngarkesa të larta dhe varen shumë nga kërkesat e përdoruesve. shpesh është e nevojshme të eksplorohen mënyra për shpërndarjen e lidhjeve për të trajtuar ngarkesa të tilla të larta në sistem.
Në themel të këtij shpërndarjeje është shumë mirë e njohur (DNS). Ky sistem lejon të transformohet emri i domain-it, për shembull, algoritmi i ciklit të peshuar (weighted round robin) dhe metodat bazuar në vonesa që ndihmojnë në shpërndarjen e ngarkesës.
është thelbësore, dhe praktikisht çdo sistem i madh në internet me të cilin na duhet të merremi sot ndodhet pas një apo disa balancuesve të ngarkesës. Balancuesit e ngarkesës ndihmojnë në shpërndarjen e kërkesave të klientëve nëpër shumë instante të disponueshme. Balancuesit e ngarkesës mund të jenë si të harduerëve ashtu edhe të softuerëve, megjithatë, në praktikë zakonisht merremi me ata të softuerëve, si p.sh. dhe . konceptualisht janë gjithashtu shumë të ngjashëm me balancuesit e ngarkesës, megjithatë, mes tyre ka një sërë . Këto dallime duhet patjetër të merren parasysh kur projektoni një sistem duke marrë parasysh nevojat tuaja.
Gjithashtu është e nevojshme të dini për (CDN). CDN është një rrjet global i shpërndarë i serverëve proxy që dërgon informacionin nga ato node që janë gjeografikisht më afër një përdoruesi të caktuar. Rrjetet CDN preferohet të përdoren nëse punoni me skedarë statikë, të shkruar në JavaScript, CSS dhe HTML. Për më tepër, sot janë të zakonshme shërbimet cloud që ofrojnë menaxherë trafiku, si p.sh. , duke ofrojnë shpërndarje globale dhe vonesa të ulëta gjatë punës me përmbajtje dinamike. Megjithatë, këto shërbime zakonisht janë të dobishme kur trajtoni shërbime në internet pa ruajtje të gjendjes.
Le të flasim për logjikën e biznesit. Strukturimi i logjikës së biznesit, flukseve të punës dhe komponenteve
Pra, kemi pasur rastin të diskutojmë aspekte të ndryshme infrastrukturore të sistemit. Me siguri, përdoruesi nuk i mendon të gjithë këto elemente të sistemit tuaj dhe, sinqerisht, nuk e shqetëson fare për ta. Përdoruesit u intereson se si është të ndërveprosh me sistemin tuaj, çfarë mund të arrish duke vepruar kështu, dhe gjithashtu si e ekzekuton sistemi komandat e përdoruesit, çfarë bën me të dhënat e përdoruesve.
Siç e bën të qartë titulli i këtij artikulli, unë kisha për qëllim të flisja rreth arkitekturës së softuerit dhe projektimit të sistemeve. Prandaj, nuk doja të shqyrtoja modelet e projektimit të softuerit që përshkruajnë si krijohen komponentët programore. Megjithatë, sa më shumë mendoj për këtë, aq më shumë më duket se kufiri midis modeleve të projektimit të softuerit dhe modeleve arkitekturore është shumë i paqartë, dhe këto dy koncepte janë ngushtë të lidhura. Merrni për shembull, (event sourcing). Sa herë që e merrni këtë model arkitekture, do të ndikojë pothuajse në të gjitha aspektet e sistemit tuaj: ruajtjen e qëndrueshme të të dhënave, nivelin e koherencës, strukturat e komponentëve në të, etj., etj. Prandaj, vendosa të përmend disa modele arkitekturore që lidhen ngushtë me logjikën e biznesit. Edhe nëse në këtë artikull duhet të kufizohem në një listë të thjeshtë, ju rekomandoj ta shqyrtoni dhe mendoni për idetë që lidhen me këto modele. Ja ku jemi:
- Koncepte , në veçanti, ,
Qasje kolaborative
Është shumë e pamundur që të jeni pjesëtari i vetëm që përgjigjet për procesin e projektimit të sistemit në një projekt. Përkundrazi, ka të ngjarë të duhet të bashkëpunoni me kolegët, që punojnë si në kuadër të detyrës tuaj ashtu edhe jashtë saj. Në këtë rast, mund të kërkohet të vlerësoni zgjidhjet teknologjike të zgjedhura së bashku me kolegët, të identifikoni nevojat e biznesit dhe të kuptoni si të ndanë më mirë detyrat.

Foto nga faqja Unsplash
Së pari, duhet të formoni një përkëdhelje të saktë dhe të njohur lidhur me atë se cilat janë qëllimet e biznesit që po përpiqeni të arrini dhe me cilat elemento të ndërveprimit do të duhet të punoni. Teknikat e modelimit grupor, veçanërisht, (event storming) ndihmojnë të përshpejtojnë ndjeshëm këtë proces dhe rrisin shanset tuaja për sukses. Mund të filloni këtë punë para ose pas se përshkruani , dhe më pas ta thelloni atë ndërsa produkti zhvillohet. Duke u mbështetur në nivelin e marrëveshjes që do të arrihet këtu, ju gjithashtu mund të formoni për atë kontekst të kufizuar, në të cilin punoni. Kur do t'ju duhet të flisni për arkitekturën e sistemit tuaj, për këtë mund të ju nevojitet , i propozuar nga , veçanërisht kur duhet të kuptoni sa do të duhet të thelloheni në detajet e problemit, duke vizualizuar gjërat që dëshironi të komunikoni.
Është e mundshme që në këtë temë të ketë edhe një teknologji tjetër të pjekur, po aq e dobishme sa projektimi i orientuar nga objekti. Megjithatë, ne përfundojmë sërish në kuptimin e fushës, ndaj njohuritë dhe përvoja në fushën e duhet t'ju jenë të dobishme.
Burimi: habr.com
