Programvaruarkitektur och systemdesign: en översikt och resursguide.

Hej kollegor.

Idag presenterar vi en översÀttning av artikeln av Tugberk Ugurlu, som har tagit sig an att kortfattat beskriva principerna för design av moderna mjukvarusystem. SÄ hÀr beskriver författaren sig sjÀlv i sin konklusion:

Programvaruarkitektur och systemdesign: en översikt och resursguide.
Eftersom det Àr nÀstintill omöjligt att tÀcka ett sÄ kolossalt Àmne som arkitekturmönster + designmönster enligt status 2019, rekommenderar vi inte bara texten av herr Ugurlu, utan ocksÄ de mÄnga lÀnkar han vÀnligt har inkluderat. Om ni gillar det, publicerar vi Àven en mer specialiserad text om design av distribuerade system.

Programvaruarkitektur och systemdesign: en översikt och resursguide.

Bild Isaac Smith frÄn Unsplash

Om du aldrig har stött pĂ„ utmaningar som att designa ett mjukvarusystem frĂ„n grunden, kan det ibland vara oklart var man ska börja nĂ€r man pĂ„börjar ett sĂ„dant arbete. Jag anser att det först och frĂ€mst Ă€r nödvĂ€ndigt att definiera grĂ€nser för att mer eller mindre sĂ€kert kunna förstĂ„ vad du faktiskt ska designa, och sedan – att sĂ€tta igĂ„ng och arbeta inom dessa grĂ€nser. En bra utgĂ„ngspunkt kan vara att ta en produkt eller tjĂ€nst (idealiskt nĂ„got du verkligen gillar) och analysera dess implementation. Du kanske blir förvĂ„nad över hur enkelt denna produkt verkar, och vilken enorm komplexitet som faktiskt döljer sig i den. Kom ihĂ„g: det enkla Ă€r oftast komplext, och det Ă€r okej.

Jag tror att det bÀsta rÄdet jag kan ge till dem som börjar designa ett system Àr: gör inga antaganden! FrÄn början mÄste du specificera de fakta som Àr kÀnda om detta system och de förvÀntningar som Àr kopplade till det. HÀr Àr nÄgra bra frÄgor vars svar kan hjÀlpa dig att börja designa:

  • Vad Ă€r problemet vi försöker lösa?
  • Vad Ă€r det maximala antalet anvĂ€ndare som kommer att interagera med vĂ„rt system?
  • Vilka mönster för skrivning och lĂ€sning av data kommer vi att anvĂ€nda?
  • Vad Ă€r de förvĂ€ntade felen, hur planerar vi att hantera dem?
  • Vilka förvĂ€ntningar finns det betrĂ€ffande systemets konsistens och tillgĂ€nglighet?
  • MĂ„ste vi ta hĂ€nsyn till nĂ„gra krav relaterade till extern granskning och reglering?
  • Vilka typer av konfidentiella data planerar vi att lagra?

Detta Àr bara nÄgra frÄgor som har varit anvÀndbara bÄde för mig och för de team jag har deltagit i under mina yrkesÄr. Om du kÀnner till svar pÄ dessa frÄgor (och andra relevanta frÄgor i den kontext dÀr du arbetar), kan du gradvis fördjupa dig i de tekniska detaljerna av uppgiften.

Vi definierar en utgÄngsnivÄ

Vad menar jag hÀr med "utgÄngsnivÄ" (baseline)? I vÄra tider kan egentligen de flesta problem inom mjukvaruindustrin "lösas" med hjÀlp av redan existerande metoder och teknologier. DÀrför, nÀr du orienterar dig i detta landskap, fÄr du ett visst försprÄng nÀr du stÀlls inför problem som nÄgon annan har löst innan dig. Kom ihÄg att program skrivs för att lösa affÀrs- och anvÀndarproblem, dÀrför strÀvar vi efter att lösa uppgiften pÄ det mest direkta och enkla sÀttet (sett ur anvÀndarens perspektiv). Varför Àr det viktigt att komma ihÄg? Kanske gillar du i ditt koordinatsystem att leta efter unika lösningar pÄ alla uppgifter, eftersom du anser att " vilken programmerare Àr jag om jag alltid följer mönster"? Faktum Àr att konsten hÀr ligger i att fatta beslut om var och vad som ska göras.SjÀlvklart mÄste vi alla regelbundet möta unika problem, var och en av dem Àr en verklig utmaning. Men om vÄr utgÄngsnivÄ Àr tydligt definierad, vet vi vad vi ska lÀgga energi pÄ: att söka fÀrdiga lösningar pÄ den uppgift vi har fÄtt, eller att studera den ytterligare för att skapa en djupare förstÄelse.

Jag tror att jag har lyckats övertyga dig om att om en specialist verkligen förstÄr arkitekturkomponenten i vissa fantastiska mjukvarusystem, kommer dessa kunskaper att vara ovÀrderliga för att bemÀstra arkitektkonsten och bygga en solid grund inom detta omrÄde.

Bra, sÄ var ska vi börja? Vid Donna Martin har en repository pÄ GitHub som heter system-design-primer, dÀr du kan lÀra dig att designa storskaliga system, samt förbereda dig för intervjuer inom detta Àmne. I repositorn finns en sektion med exempel pÄ verkliga arkitekturer., dÀr det bland annat diskuteras hur man nÀrmar sig designen av sina system nÄgra vÀlkÀnda företag, till exempel Twitter, Uber, osv.

Men innan vi gĂ„r vidare till detta material, lĂ„t oss ta en nĂ€rmare titt pĂ„ de viktigaste arkitektoniska utmaningar som praktiken stĂ€lls inför. Detta Ă€r viktigt eftersom det innebĂ€r att man mĂ„ste specificera MÅNGA aspekter av ett komplext och mĂ„ngfacetterat problem, och sedan lösa det inom de regelverk som gĂ€ller för detta system. Jackson Gabbard, tidigare anstĂ€lld pĂ„ Facebook, spelade in ett 50-minutersvideo om intervjuer kring systemdesign, dĂ€r han delade med sig av sina egna erfarenheter frĂ„n att ha granskat hundratals kandidater. Trots att videon tydligt handlar om design av stora system och kriterier för framgĂ„ng, som Ă€r viktiga vid rekrytering för en sĂ„dan tjĂ€nst, kommer den Ă€ndĂ„ att fungera som en fullstĂ€ndig resurs om vad som Ă€r mest betydelsefullt vid systemdesign. Jag föreslĂ„r Ă€ven en sammanfattning av denna video.

Bygg upp kunskaper om datalagring och -hÀmtning

I allmÀnhet pÄverkar ditt beslut om hur du lÄngsiktigt kommer att lagra och leverera dina data kritiskt systemets prestanda. DÀrför mÄste du framför allt förstÄ de förvÀntade egenskaperna för skrivning och lÀsning av data i ditt system. Sedan mÄste du kunna utvÀrdera dessa parametrar och göra val baserat pÄ dessa uppskattningar. Men för att kunna hantera detta arbete effektivt mÄste du ha kunskap om befintliga datalagringsmönster. I princip förutsÀtter detta gedigna kunskaper relaterade till val av databas.

Databaser kan betraktas som datatyper med exceptionell skalbarhet och hĂ„llbarhet. DĂ€rför kommer kunskap om datatyper att vara mycket anvĂ€ndbar för dig Ă€ven vid valet av en viss databas. Till exempel Redis – Ă€r en databasserver som stöder olika typer av vĂ€rden. Den möjliggör arbete med datatyper som listor och mĂ€ngder, samt lĂ€sning av data med hjĂ€lp av vĂ€lkĂ€nda algoritmer, sĂ„som LRU, organiserar detta arbete pĂ„ ett hĂ„llbart och hög- tillgĂ€ngligt sĂ€tt.

Programvaruarkitektur och systemdesign: en översikt och resursguide.

Bild Samuel Zeller frÄn Unsplash

NĂ€r du har tillrĂ€ckligt med kunskap om olika datalagringsmönster – gĂ„ vidare till att studera konsistens och tillgĂ€nglighet av data. Först och frĂ€mst behöver du förstĂ„ CAP-teoremet Ă„tminstone i grova drag, och sedan finslipa dessa kunskaper genom att noggrant undersöka etablerade mönster konsistens och tillgĂ€nglighet. PĂ„ sĂ„ sĂ€tt kommer du att bredda din horisont inom detta omrĂ„de och förstĂ„ att lĂ€sning och skrivning av data i sjĂ€lva verket Ă€r tvĂ„ mycket olika problem, och var och en av dem har sina egna sĂ€rskilda utmaningar. BevĂ€pnad med nĂ„gra mönster för att sĂ€kerstĂ€lla konsistens och tillgĂ€nglighet kommer du att kunna avsevĂ€rt öka systemets prestanda, samtidigt som du garanterar en oavbruten tillgĂ„ng till data för dina applikationer.

Slutligen, nĂ€r vi avslutar diskussionen om datalagringsfrĂ„gor, bör vi ocksĂ„ nĂ€mna cachelagring. Ska den utföras samtidigt pĂ„ klienten och servern? Vilka data kommer att finnas i din cache? Och varför? Hur organiserar du cache-invalidering? Kommer det att utföras regelbundet, med vissa intervall? Om ja – hur ofta? Jag rekommenderar att du börjar behandlingen av dessa Ă€mnen med nĂ€sta avsnitt den ovan nĂ€mnda handboken om systemdesign.

Kommunikationsmönster

System bestÄr av olika komponenter; dessa kan vara bÄde olika processer som arbetar inom samma fysiska enhet och olika maskiner som agerar i olika delar av ditt nÀtverk. Vissa av dessa resurser inom ditt nÀtverk kan vara privata, men andra mÄste vara offentliga och öppna för konsumenter som kontaktar dem utifrÄn.

Det Àr nödvÀndigt att sÀkerstÀlla kommunikationen mellan dessa resurser och Àven informationsutbytet mellan hela systemet och omvÀrlden. I sammanhanget av systemdesign stÄr vi hÀr Äterigen inför en uppsÀttning nya unika utmaningar. Vi undersöker hur asynkrona uppgiftsflöden, samt vilka olikakommunikationsmönster som finns tillgÀngliga.

Programvaruarkitektur och systemdesign: en översikt och resursguide.

Bild Tony Stoddard frÄn Unsplash

Vid organiseringen av kommunikationen med omvÀrlden Àr det alltid mycket viktigt sÀkerhet, vilket ocksÄ mÄste nÀrmas med största allvar och aktivt skötas.

Fördelning av anslutningar

Jag Ă€r inte sĂ€ker pĂ„ att det Ă€r motiverat att lyfta fram detta Ă€mne i en separat sektion. ÄndĂ„ kommer jag hĂ€r att utförligt redogöra för denna koncept, och jag anser att materialet i denna sektion bĂ€st beskriver termen "anslutningsfördelning" (connection distribution).

System bildas genom att korrekt koppla samman mÄnga komponenter, och deras kommunikation med varandra organiseras ofta pÄ grundval av etablerade protokoll, som till exempel TCP och UDP. Men dessa protokoll Àr ofta otillrÀckliga för att tillfredsstÀlla alla behov hos moderna system som ofta körs under hög belastning och som dessutom Àr starkt beroende av anvÀndarnas behov. Det kan ofta vara nödvÀndigt att hitta sÀtt att fördela anslutningar för att hantera sÄdana hög belastningar i systemet.

Grunden för sÄdan fördelning ligger i det vÀlkÀnda domÀnnamnssystemet (DNS). Detta system möjliggör omvandling av domÀnnamn, till exempel viktscyklisk algoritm (weighted round robin) och metoder baserade pÄ latens, som hjÀlper till att fördela belastningen.

Lastbalansering Àr grundlÀggande och praktiskt taget varje stort system pÄ Internet, som vi har att göra med idag, ligger bakom en eller flera belastningsbalanserare. Belastningsbalanserare hjÀlper till att fördela klientförfrÄgningar mellan flera tillgÀngliga instanser. Belastningsbalanserare kan vara bÄde hÄrdvarubaserade och mjukvarubaserade, men i praktiken handlar vi oftast med mjukvarubaserade, som till exempel HAProxy och ELB. OmvÀnda proxyservrar Àr i princip ocksÄ mycket likartade belastningsbalanserare, Àven om det finns en rad tydliga skillnader. Dessa skillnader mÄste beaktas nÀr man designar ett system utifrÄn dina behov.

Det Àr ocksÄ viktigt att förstÄ innehÄllsleveransnÀtverk (CDN). CDN Àr ett globalt distribuerat nÀtverk av proxyservrar som levererar information frÄn de noder som geografiskt ligger nÀrmast en specifik anvÀndare. CDN-nÀtverk Àr att föredra nÀr du arbetar med statiska filer skrivna i JavaScript, CSS och HTML. Dessutom Àr det idag vanligt med sÄdana molntjÀnster dÀr trafikhanterare erbjuds, till exempel Azure Traffic Manager, som ger dig global distribution och minskad fördröjning vid arbete med dynamiskt innehÄll. Men sÄdana tjÀnster Àr vanligtvis anvÀndbara i situationer dÀr man arbetar med tillstÄndslösa webbservices.

LÄt oss prata om affÀrslogik. Strukturerande affÀrslogik, arbetsflöden och komponenter

SÄ, vi har hunnit diskutera olika infrastrukturaspekter av systemet. AnvÀndaren tÀnker troligen inte ens pÄ alla dessa element i ditt system och, Àrligt talat, bryr de sig överhuvudtaget inte om dem. AnvÀndarna Àr intresserade av hur det Àr att interagera med ditt system, vad man kan uppnÄ genom att agera pÄ detta sÀtt, samt hur systemet utför anvÀndarens kommandon, vad som görs med anvÀndardata.

Som titeln pĂ„ denna artikel antyder, tĂ€nkte jag berĂ€tta om mjukvaruarkitektur och systemdesign. DĂ€rför planerade jag inte att gĂ„ in pĂ„ designmönster för mjukvara, vilka beskriver hur programkomponenter skapas. Men ju mer jag funderar pĂ„ det, desto mer kĂ€nns det som att grĂ€nsen mellan designmönster för mjukvara och arkitektoniska mönster Ă€r mycket otydlig, och dessa tvĂ„ begrepp Ă€r tĂ€tt sammanlĂ€nkade. LĂ„t oss till exempel ta event sourcing. SĂ„ snart du tillĂ€mpar detta arkitektoniska mönster – kommer det att pĂ„verka nĂ€stan alla aspekter av ditt system: lĂ„ngsiktig datalagring, nivĂ„n av konsistens som accepteras i ditt system, konturerna av komponenterna i den, osv. DĂ€rför har jag beslutat att nĂ€mna nĂ„gra arkitektoniska mönster som direkt rör affĂ€rslogik. Även om denna artikel kanske tvingas begrĂ€nsa sig till en enkel lista, rekommenderar jag att du bekantar dig med den och reflekterar över idĂ©erna som rör dessa mönster. HĂ€r Ă€r den:

Kollaborativa metoder

Det Àr mycket osannolikt att du kommer att vara den enda personen ansvarig för designprocessen av systemet i projektet. Snarare kommer du troligen att behöva samarbeta med kollegor som arbetar bÄde inom och utanför din uppgift. I detta fall kan det bli nödvÀndigt att utvÀrdera de valda teknologiska lösningarna tillsammans med kollegor, identifiera affÀrsbehov och förstÄ hur man bÀst kan parallellisera uppgifter.

Programvaruarkitektur och systemdesign: en översikt och resursguide.

Bild Kaleidico frÄn Unsplash

Först och frÀmst mÄste ett exakt och allmÀnt accepterat begrepp utvecklas om vilket affÀrsmÄl du försöker nÄ och vilka rörliga delar du kommer att behöva hantera. Metoder för gruppmodellering, sÀrskilt event storming hjÀlper avsevÀrt att snabba upp denna process och ökar dina chanser till framgÄng. Detta arbete kan utföras innan eller efter att du har skisserat grÀnserna för dina tjÀnster, och sedan fördjupa det i takt med att produkten mognar. Baserat pÄ den nivÄ av enighet som uppnÄs hÀr kan du ocksÄ formulera ett gemensamt sprÄk för det begrÀnsade sammanhang dÀr du arbetar. NÀr det Àr dags att prata om arkitekturen för ditt system kan en C4-modell, föreslagen av Simon Brown, vara till stor hjÀlp, sÀrskilt nÀr det handlar om att förstÄ hur mycket du behöver gÄ in pÄ detaljer nÀr du visualiserar de saker du vill kommunicera.

Det finns förmodligen ocksÄ annan mogen teknik inom detta Àmne som Àr lika anvÀndbar som domÀnorienterad design. Men vi Äterkommer hur som helst till förstÄelsen av ÀmnesomrÄdet, sÄ kunskap och erfarenhet inom domÀnorienterad design kommer att vara till nytta för dig.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster