Tarkvaraarhitektuur ja süsteemide projekteerimine: üldine ülevaade ja ressursside juhend

Tere, kolleegid.

Täna esitame teie tähelepanu tõlke Tugberk Ugurlu artiklist, kus on võrreldes väiksema mahuga välja toodud kaasaegsete tarkvarasüsteemide projekteerimise põhimõtted. Siin on, mida autor enda kohta ütleb.

Tarkvaraarhitektuur ja süsteemide projekteerimine: üldine ülevaade ja ressursside juhend
Kuna sellise kolossaalset teemat, nagu arhitektuurilised mustrid + projekteerimise mustrid aastaks 2019, on võimatu hajutada, soovitame mitte ainult härra Ugurlu teksti, vaid ka rohkelt linke, mille ta lahkesti esitanud on. Kui see teile meeldib, avaldame ka kitsama eriteema tekstid jaotatud süsteemide projekteerimise kohta.

Tarkvaraarhitektuur ja süsteemide projekteerimine: üldine ülevaade ja ressursside juhend

Pilt Isaac Smith Unsplashi saidilt

Kui te pole kunagi silmitsi seisnud selliste väljakutsetega nagu tarkvarasüsteemi projekteerimine nullist, siis alustades sellist tööd ei ole mõnikord isegi selge, kust alustada. Usun, et esmalt on vajalik joonistada piirid, et enam-vähem kindlalt mõista, mida te täpselt projekteerima hakkate, ja seejärel – rullida üles varrukad ja töötada, jäädes nende piiride sisse. Aluspunktiks võib võtta mõne toote või teenuse (ideaalis – sellise, mis teile väga meeldib) ja analüüsida selle teostust. Võib-olla imestate, kui lihtne see toode välja näeb ning kui suur keerukus selles tegelikult peitub. Ärge unustage: lihtne on tavaliselt keeruline, ja see on normaalne.

Arvan, et parim nõuanne neile, kes alustavad süsteemi projekteerimist, on: ärge tehke mingeid oletusi! Alates esimesest hetkest on oluline täpsustada faktid, mis on selle süsteemi kohta teada, ja sellega seotud ootused. Siin on mõned head küsimused, millele vastamine aitab teil projekti alustada:

  • Mis on probleem, mida me püüame lahendada?
  • Kui palju kasutajaid suudab meie süsteem korraga taluda?
  • Milliseid andmete kirjutamise ja lugemise mustreid me kasutama hakkame?
  • Millised on oodatavad tõrkeolukorrad ja kuidas me plaanime nendega toime tulla?
  • Millised ootused kehtivad süsteemi järjepidevuse ja kättesaadavuse osas?
  • Kas tuleb töö käigus arvesse võtta mingeid nõudeid, mis on seotud välistest kontrollidest ja regulatsioonidega?
  • Milliseid konfidentsiaalsete andmete vorme me kavatseme salvestada?

Need on vaid mõned küsimused, mis on olnud abiks nii mulle kui ka meeskondadele, kellega olen aastate jooksul töötanud. Kui tead vastuseid neile küsimustele (ja teistele, mis on kontekstis, kus sa töötad, asjakohased), saad süveneda tehnilistele detailidele.

Seame algtaseme

Mida mõistan ma siin «algtaseme» all? Tänapäeval on enamik tarkvarainstitutsioonide probleeme «lahendatavad» juba olemasolevate meetodite ja tehnoloogiate abil. Seega, selle maastiku tundmine annab sulle teatud eelise, kui puutud kokku probleemidega, mida keegi teine on enne sind lahendanud. Pea meeles, et programmid on kirjutatud äri- ja kasutajaprobleemide lahendamiseks, seega püüame lahendust leida kõige otsemal ja lihtsamal (kasutaja seisukohalt) viisil. Miks on seda oluline meeles pidada? Võib-olla sulle meeldib oma koordinaatides leida ainulaadseid lahendusi igale probleemile, arvates, et «kuidas ma saan olla programmeerija, kui järgnen kõigile mustritele»? Tegeliselt, kunsti seisneb siin otsuste tegemises, kus ja mida teha. Loomulikult seisavad meie ees aeg-ajalt unikaalsed probleemid, igaüks neist on tõeline väljakutse. Kuid kui meie algtase on selgelt piiritletud, teame, kuhu investeerida: kas valmis lahenduste leidmiseks või probleemi sügavamaks uurimiseks ja mõistmiseks.

Arvan, et mul on õnnestunud sind veenda, et kui spetsialist mõistab kindlalt aru saada, milline on teatud suurepäraste tarkvarasüsteemide arhitektuuriline omadus, siis need teadmised on hindamatud arhitektuuri kunsti omandamisel ja selle valdkonna kindla alusbaasi loomisel.

No hästi, kust alustada? Ü Donna Martin on loonud GitHubis hoidla nimega system-design-primer, mille materjalide abil saad õppida suurte süsteemide projekteerimist ja valmistuda intervjuudeks selle teema kohta. Hoidlas on jaotis näidete reaalsetest arhitektuuridest, kus arutatakse, kuidas organisatsioonid oma süsteemide disainile lähenevad mõned tuntud ettevõtted, nagu Twitter, Uber jne.

Kuid enne selle sisu juurde liikumist tasub lähemalt uurida kõige olulisemaid arhitektuurilisi väljakutseid, millega praktikas silmitsi seistakse. See on oluline, kuna tuleb täpsustada PALJU aspekte, mis on keerulise ja mitmekesise probleemi osa, ning seejärel lahendada see antud süsteemis kehtivate regulatsioonide raames. Jackson Gabbard, endine Facebooki töötaja, salvestas 50-minutilise video intervjuudest, mis käsitlevad süsteemide disaini, kus ta jagas oma isiklikku kogemust sadade kandidaatide läbivaatamisel. Kuigi video käsitleb selgelt suurte süsteemide disaini ja eduka kandidaadi valimise kriitereid, tuleb see siiski põhjalikuks allikaks selle kohta, mis on kõige tähtsam süsteemide disainimisel. Samuti pakun kuid selle video kokkuvõtet.

Koguge teadmisi andmete salvestamisest ja väljastamisest

Üldiselt mõjutab teie otsus, kuidas te soovite oma andmeid pikaajaliselt salvestada ja edastada, süsteemi jõudlust kriitiliselt. Seetõttu peaksite kõigepealt mõistma oma süsteemis andmete salvestamise ja lugemise oodatavaid omadusi. Siis peate olema võimeline neid näitajaid hindama ja tegema valikud tuginedes tehtud hindamistele. Kuid te suudate seda tööd tõhusalt teha vaid siis, kui olete teadlik olemasolevatest andmestruktuuri mudelitest. Üldiselt tähendavad need kindlaid teadmisi, mis on seotud andmebaasi valikuga.

Andmebaase võib pidada andmestruktuurideks, millel on erakordne skaleeritavus ja püsivus. Seetõttu peaks andmestruktuuride tundmine olema kasulik ka teile, kui valite ühte või teist andmebaasi. Näiteks Redis Redis on andmestruktuuride teenus, mis toetab erinevaid väärtuste tüüpe. See võimaldab töötada selliste andmestruktuuridega nagu loendid ja komplektid ning lugeda andmeid tuntud algoritmide kaudu, näiteks LRU, korraldades seda tööd püsivas ja kõrge kättesaadavuse vormis.

Tarkvaraarhitektuur ja süsteemide projekteerimine: üldine ülevaade ja ressursside juhend

Pilt Samuel Zeller Unsplashi saidilt

Kui olete piisavalt orienteeritud erinevates andmete salvestamise mustrites, liikuge edasi andmete järjepidevuse ja kättesaadavuse uurimise juurde. Esmalt peate omandama CAP-teoreemi , vähemalt üldiselt, ja seejärel täiendama neid teadmisi, uurides lähemalt juurdunud mustreid järjepidevus ja kättesaadavus. Nii saad te tunda valdkonna laiemat pilti ja mõista, et andmete lugemine ja kirjutamine on tegelikult kaks täiesti erinevat probleemi, igaühega on seotud oma spetsiifilised väljakutsed. Varustades end mitmete järjepidevuse ja kättesaadavuse tagamise mustritega, saate märkimisväärselt tõsta süsteemi tootlikkust, samal ajal tagades andmete sujuva kättesaadavuse teie rakendustes.

Lõpetades andmete salvestamise teemadel rääkimise, tuleb mainida ka vahemälu. Kas seda tuleks hallata samaaegselt kliendis ja serveris? Milliseid andmeid hoiate vahemälus? Ja miks? Kuidas organiseerite vahemälu tühjendamise? Kas see toimub regulaarselt, teatud ajavahemike järel? Kui jah, siis kui sageli? Nende teemadega soovitaksin alustada järgmisest jaost ülespool mainitud süsteemide projekteerimise käsiraamatust.

Kommunikatsioonimustrid

Süsteemid koosnevad erinevatest komponentidest; need võivad olla erinevad protsessid, mis töötavad ühe ja sama füüsilise sõlme sees, või erinevad masinad, mis tegutsevad teie võrgu erinevates osades. Mõned neist ressurssidest teie võrgu piires võivad olla privaatsed, aga teised peavad olema avalikud ja avatud väliskasutajatele, kes neile ligipääsu otsivad.

On oluline tagada nende ressursside omavaheline kommunikatsioon, samuti teabe vahetamine kogu süsteemi ja välismaailma vahel. Süsteemide projekteerimise kontekstis seisame siin jälle silmitsi uute ainulaadsete väljakutsetega. Uurime, kuidas võivad olla kasulikud asünkroonsed töövood, ja millised erinevad kommunikatsioonimustrid on saadavalToni Stoddard.

Tarkvaraarhitektuur ja süsteemide projekteerimine: üldine ülevaade ja ressursside juhend

Pilt Välismaailmaga suhtlemise korraldamisel on alati äärmiselt oluline Unsplashi saidilt

, mille tagamisele tuleb läheneda tõsiselt ja aktiivselt tegeleda selle teemaga. turvalisusÜhenduste jaotamine

Ühenduste jaotamine

Ei ole kindel, et selle teema eraldi sektsiooniks välja toomine näib kõigile põhjendatud. Sellegipoolest selgitan siin seda kontseptsiooni põhjalikult, tuues välja, et selle osa materjali on kõige täpsem kirjeldada terminiga „ühenduste jaotamine“ (connection distribution).

Süsteemid kujunevad välja õige hulga komponentide ühendamise kaudu, ja nendevaheline kommunikatsioon toimub sageli kehtivate protokollide, näiteks TCP ja UDP alusel. Kuid enamasti pole neid protokolle piisavalt, et rahuldada kaasaegsete süsteemide kõiki vajadusi, mis sageli töötavad kõrge koormuse all ja sõltuvad suuresti kasutajate nõudmistest. Sageli on vajalik leida viise ühenduste jaotamiseks, et tulla toime selliste kõrgete koormustega süsteemis.

Selle jaotamise aluseks on hästi tuntud domeeninimi süsteem (DNS). Selline süsteem võimaldab muuta domeeninime, näiteks kaalutud ringdaanide algoritmi (weighted round robin) ja viivituste põhised meetodid, mis aitavad jaotada koormust.

Koormuse tasakaalustamine on põhimõtteliselt oluline, ja praktiliselt iga suur süsteem Internetis, millega me täna kokku puutume, asub ühe või mitme koormuse tasakaalustaja taga. Koormuse tasakaalustajad aitavad jaotada kliendi päringud mitme saadaval oleva eksemplari vahel. Koormuse tasakaalustajad võivad olla nii riistvara kui ka tarkvara, kuid praktikas puutume sagedamini kokku tarkvaralistega, näiteks Edasi läks kliendi päring HAProxy-sse, mis lahendas järgmised ülesanded: ja ELB. Tagasi pöördud serverid on kontseptsioonilt samuti väga sarnased koormuse tasakaalustajatele, kuigi nende vahel on rida selgeid erinevusi. Need erinevused tuleb tingimata arvesse võtta, kavandades süsteemi vastavalt oma vajadustele.

Samuti tuleb olla teadlik sisu edastamise võrkudest (CDN). CDN on globaalne jaotatud serverite võrk, mis edastab teavet nendest sõlmedest, mis asuvad geograafiliselt lähemal konkreetsele kasutajale. CDN-e on eelistatav kasutada, kui töötate staatiliste failidega, mis on kirjutatud JavaScriptis, CSS-is ja HTML-is. Lisaks on tänapäeval levinud sellised pilveteenused, mille kaudu pakutakse liikluse haldurit, näiteks Azure Traffic Manager, tagades teile globaalne levik ja vähenenud latentsus dünaamilise sisu kasutamisel. Siiski on sellised teenused tavaliselt kasulikud olukordades, kus tuleb töötada seisu säilitamata veebiteenustega.

Räägime äriloogikast. Äri loogika, ülesandeloome ja komponentide struktuurimine.

Nii oleme saanud arutada erinevaid süsteemi infrastruktuuri aspekte. Tõenäoliselt ei mõtle kasutaja isegi kõigile nendele teie süsteemi elementidele ja, ausalt öeldes, ei muretse nende pärast üldse. Kasutajat huvitab, kuidas on suhelda teie süsteemiga, mida on võimalik saavutada, kui tegutseda nii, ning kuidas süsteem täidab kasutaja käske, mida ja kuidas ta teeb kasutaja andmetega.

Kuidas selgesti pealkirjast selgub, plaanisin selles artiklis rääkida tarkvara arhitektuurist ja süsteemide projekteerimisest. Seetõttu ei kavatsenud ma kirjeldada tarkvarade projekteerimise mustreid, mis näitavad, kuidas luuakse tarkvarakomponente. Kuid mida rohkem ma sellest mõtlen, seda enam tundub mulle, et piir tarkvarade projekteerimise mustrite ja arhitektuuriliste mustrite vahel on väga hägune ja need kaks kontseptsiooni on tihedalt seotud. Võtame näiteks sündmuste registreerimise (event sourcing). Kui hakkate seda arhitektuurilist mustrit rakendama, mõjutab see praktiliselt kõiki teie süsteemi aspekte: andmete pikaajaline salvestamine, teie süsteemis kehtiv konsistentsitase, komponentide kontuurid jne. Seetõttu otsustasin mainida mõningaid arhitektuurilisi mustreid, mis on otseselt seotud äriloogikaga. Isegi kui selles artiklis tuleb piirduda lihtsa loendiga, soovitan teil tutvuda sellega ja mõelda ideedele, mis on seotud nende mustritega. Siin on, palun:

Koostöö lähenemisviisid

On tõenäoliselt väga vähe tõenäoline, et te olete projektis see osaleja, kes üksi vastutab süsteemi projekteerimise protsessi eest. Vastupidi, tõenäoliselt peate te suhtlema kolleegidega, kes töötavad nii teie ülesande raames kui ka väljaspool seda. Sel juhul võib osutuda vajalikuks hinnata valitud tehnoloogilisi lahendusi koos kolleegidega, eristada ärilisi vajadusi ja mõista, kuidas ülesandeid paremini paralleelselt täita.

Tarkvaraarhitektuur ja süsteemide projekteerimine: üldine ülevaade ja ressursside juhend

Pilt Kaleidico Unsplashi saidilt

Esiteks on vajalik välja töötada täpne ja üldiselt tunnustatud arusaam, milline on see ärieesmärk, mida te üritate saavutada, ja milliste muutuvate elementidega te peate tegelema. Rühmamudeldamise tehnikad, sealhulgas sündmuste tormamine (event storming), aitavad seda protsessi oluliselt kiirendada ja suurendavad teie eduvõimalusi. Selle uurimisega saab tegeleda enne või pärast seda, kui olete määratlenud teie teenuste piirid, ja seejärel süvendada seda toote küpsemise ajal. Tuginenud sellele ühtse arusaamade tasemele, mida siin saavutatakse, saate ka sõnastada ühtse keele selle piiratud konteksti jaoks, milles te töötate. Kui on vaja rääkida teie süsteemi arhitektuurist, võib teile kasulikuks osutuda C4 mudel, mille pakkus välja Simon Brown, eriti kui on vaja mõista, kui palju peate problemaatika detailidesse süvenema, visualiseerides asju, mida soovite edastada.

Tõenäoliselt leidub sellel teemal ka teisi küpseid tehnoloogiaid, mis on sama kasulikud kui ainepõhine disain. Siiski, me naaseme, olgu kuidas on, aineala mõistmise juurde, seetõttu reaalne teadmine ja kogemus ainepõhisest disainist peaks teile kasuks tulema.

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster