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:

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.

Bild 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: , 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 har en repository pÄ GitHub som heter , 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Ä , dÀr det bland annat diskuteras hur man nÀrmar sig designen av sina system , 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. , tidigare anstÀlld pÄ Facebook, spelade in , 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 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 .
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 â Ă€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 , organiserar detta arbete pĂ„ ett hĂ„llbart och hög- tillgĂ€ngligt sĂ€tt.

Bild 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Ă„ Ă„tminstone i grova drag, och sedan finslipa dessa kunskaper genom att noggrant undersöka etablerade mönster och . 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 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 , samt vilka olika.

Bild frÄn Unsplash
Vid organiseringen av kommunikationen med omvÀrlden Àr det alltid mycket viktigt , 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 (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.
À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 och . Àr i princip ocksÄ mycket likartade belastningsbalanserare, Àven om det finns en rad . Dessa skillnader mÄste beaktas nÀr man designar ett system utifrÄn dina behov.
Det Àr ocksÄ viktigt att förstÄ (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 , 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 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:
- Begreppen , sÀrskilt ,
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.

Bild 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 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 , 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 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 , föreslagen av , 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 kommer att vara till nytta för dig.
KĂ€lla: habr.com
