Mugavad arhitektuurilised mustrid

Tere, Habr!

Seoses praeguste sĂŒndmustega koroonaviiruse tĂ”ttu on mitmed internetiteenused hakanud saama suuremat koormust. NĂ€iteks, ĂŒks jaekettest Suurbritannias lihtsalt sulges oma veebisaidi tellimuste jaoks, kuna ressursid said otsa. Ja kaugel sellest, et serverit saaks lihtsalt kiiremaks muuta, lisades vĂ”imsamat varustust, peab klientide pĂ€ringud siiski töötlema (vĂ”i nad lĂ€hevad konkurentide juurde).

Selles artiklis rÀÀgin lĂŒhidalt populaarsetest praktikatest, mis vĂ”imaldavad luua kiire ja tĂ”rkeennetuse teenuse. Kuid valitud arendusmoodulite seas on ainult need, millega praegu on lihtne Ă€ra kasutada. Iga punkti jaoks on teil kas juba olemasolevad teegid vĂ”i vĂ”imalus probleem lahendada pilveteenuse abil.

Horiontaalne skaleerimine

KĂ”ige lihtsam ja kĂ”igile tuntud punkt. Üldiselt on kĂ”ige sagedamini kaks koormuse jaotamise skeemi — horisontaalne ja vertikaalne skaleerimine. Esimesel juhul lubate teenustel töötada paralleelselt, jaotades seelĂ€bi koormuse nende vahel. Teisel te tellite vĂ”imsamaid servereid vĂ”i optimeerite koodi.

NÀiteks vÔtan abstraktse pilveteenuse failide salvestamiseks, sarnase OwnCloudile, OneDrive'ile ja muudele.

Allpool on standardne diagramm sarnase sĂŒsteemi kohta, kuid see demonstreerib vaid sĂŒsteemi keerukust. Peame leidma viisi teenuste sĂŒnkroonimiseks. Mis juhtub, kui kasutaja salvestab faili tahvelarvutisse ja soovib seda hiljem vaadata telefonist?

Mugavad arhitektuurilised mustrid
Erinevus lÀhenemistes: vertikaalsel skaleerimisel oleme valmis suurendama sÔlmede vÔimsust, samas kui horisontaalsel lisame uusi sÔlmi, et koormust jaotada.

CQRS

Command Query Responsibility Segregation on ĂŒsna oluline muster, kuna see vĂ”imaldab erinevatel klientidel mitte ainult ĂŒhenduda erinevate teenustega, vaid ka saada samu sĂŒndmuste vooge. Selle eelised ei ole lihtsa rakenduse puhul nii ilmsed, kuid see on ÀÀrmiselt oluline (ja lihtne) koormatud teenuse jaoks. Selle tuum: sisenevad ja vĂ€ljuvad andmevood ei tohiks ĂŒksteist ristuda. See tĂ€hendab, et te ei saa saata pĂ€ringut ja oodata vastust, vaid saadate pĂ€ringu teenusesse A, kuid saate vastuse teenuses B.

Selle lĂ€henemise esimene eelis on vĂ”imalus katkestada ĂŒhendus (selle sĂ”na laiemas tĂ€henduses) pika kĂŒsimise protsessi kĂ€igus. Toome nĂ€iteks enam-vĂ€hem tavalise jĂ€rjestuse:

  1. Klient saatis palveli serverile.
  2. Server alustas pika töötlemisega.
  3. Server vastas kliendile tulemusega.

Kujutage ette, et punktis 2 toimus ĂŒhenduse katkestamine (kas vĂ”rgu uuendamine vĂ”i kasutaja liikus teisele lehele, katkestades ĂŒhenduse). Sel juhul on serveril keeruline saata vastust kasutajale, milline teave on kĂ€ideldud. CQRS-i rakendades on jĂ€rjestus pisut erinev:

  1. Klient tellis vÀrskendusi.
  2. Klient saatis palveli serverile.
  3. Server vastas 'pÀring vastu vÔetud'.
  4. Server vastas tulemusega kanali kaudu punktist '1'.

Mugavad arhitektuurilised mustrid

Nagu nĂ€ha, on skeem pisut keerukam. Veelgi enam, intuitiivne request-response lĂ€henemine ei ole siin kohal. KĂŒll aga on selge, et ĂŒhenduse katkestamine pĂ€ringu töötlemise kĂ€igus ei too kaasa viga. Veelgi enam, kui kasutaja on tegelikult ĂŒhendatud teenusega mitme seadme kaudu (nĂ€iteks mobiiltelefoni ja tahvelarvuti kaudu), saab korraldada nii, et vastus jĂ”uaks mĂ”lemasse seadmesse.

Huvitav on see, et sissetulevate sĂ”numite töötlemise kood on ĂŒhesugune (mitte 100%) nii klientide poolt mĂ”jutatud sĂŒndmuste kui ka teiste sĂŒndmuste jaoks, sealhulgas teiste klientide sĂŒndmuste jaoks.

Kuid tegelikkuses saame me lisaboonuseid seetĂ”ttu, et ĂŒhesuunalist voogu saab töödelda funktsionaalses stiilis (kasutades RX ja analooge). Ja see on juba tĂ”sine pluss, kuna pĂ”himĂ”tteliselt saab rakenduse teha tĂ€iesti reaktiivseks, rakendades samas funktsionaalset lĂ€henemist. Suurtele programmidele vĂ”ib see mĂ€rkimisvÀÀrselt sÀÀsta ressursse arendamisel ja hooldamisel.

Kui kombineerida see lĂ€henemine horisontaalse skaleerimisega, siis saadame me soovi korral pĂ€ringud ĂŒhele serverile ja saame vastused teisest. Seega saab klient ise valida endale sobiva teenuse, samas kui sĂŒsteem suudab sisemiselt sĂŒndmusi Ă”igesti töödelda.

Event Sourcing

Nagu teate, on jaotatud sĂŒsteemi ĂŒheks peamiseks omaduseks ĂŒldise aja ja ĂŒhise kriitilise sektsiooni puudumine. Ühe protsessi raames vĂ”ite synchroniseerida (kĂ”igi samade mutex'ite abil), mille jooksul olete kindel, et keegi teine ei tĂ€ida seda koodi. Kuid jaotatud sĂŒsteemi puhul on see ohtlik, kuna see toob kaasa kulutusi ning tapab kogu skaleeritavuse vĂ”lu — kĂ”ik komponendid peavad ikkagi ootama ĂŒksteist.

SeetĂ”ttu saame olulise tĂ”e — kiiret jaotatud sĂŒsteemi ei saa synchroniseerida, kuna muidu vĂ€hendame jĂ”udlust. Teiselt poolt vajame sageli teatud komponentide jĂ€rjepidevust. Selleks saab kasutada lĂ€henemist eventual consistency, kus garanteeritakse, et andmete muutuste puudumisel teatud ajavahemiku jooksul pĂ€rast viimast uuendust („lĂ”puks”) tagastavad kĂ”ik pĂ€ringud viimane uuendatud vÀÀrtus.

Oluline on mĂ”ista, et traditsiooniliste andmebaaside puhul rakendatakse sageli ranget jĂ€rjepidevust, kus iga sĂ”lm omab samu andmeid (sarnast saavutatakse sageli siis, kui tehingut peetakse kehtivaks alles pĂ€rast teise serveri vastust). Siiski on siin mĂ”ned leevendused isoleerimise tasetest, kuid pĂ”hikirjeldus jÀÀb samaks — te saate elada tĂ€iesti kooskĂ”lastatud maailmas.

Kuid naaseme algse ĂŒlesande juurde. Kui osa sĂŒsteemist saab ehitada eventual consistency, siis saab luua jĂ€rgmise skeemi.

Mugavad arhitektuurilised mustrid

Selle lÀhenemise olulised omadused:

  • Iga tulev asi paneb ĂŒhte jĂ€rjekorda.
  • KĂŒsimuse töötlemise kĂ€igus vĂ”ib teenus samuti paigutada ĂŒlesandeid teistesse jĂ€rjekordadesse.
  • Igal siseneval sĂŒndmusel on identifikaator (mis on vajalik dedupikatsiooniks).
  • JĂ€rjekord töötab ideoloogiliselt skeemi "append only" alusel. Sealt ei saa elemente kustutada ega ĂŒmber paigutada.
  • JĂ€rjekord töötab FIFO skeemi alusel (vabandust tautoloogia pĂ€rast). Kui on vajalik paralleelne tĂ€itmine, siis tuleks ĂŒhel etappidel objektid erinevatesse jĂ€rjekordadesse ĂŒmber paigutada.

Kordan, et vaatleme olukorda veebipĂ”hise failihoiustamise sĂŒsteemi. Sel juhul nĂ€eb sĂŒsteem umbes selline vĂ€lja:

Mugavad arhitektuurilised mustrid

Oluline on, et diagrammil olevad teenused ei tÀhenda tingimata eraldi serverit. Isegi protsess vÔib olla sama. Oluline on midagi muud: ideoloogiliselt on need asjad jagatud nii, et horisontaalne skaleerimine oleks hÔlpsasti rakendatav.

Kahte kasutajat teenuseseade nÀeb vÀlja selline (teenused, mis on mÔeldud erinevatele kasutajatele, on eristatud erinevate vÀrvidega):

Mugavad arhitektuurilised mustrid

Sellise kombinatsiooni eelised:

  • Teabe töötlemise teenused on jagatud. OotejĂ€rjekorrad on samuti eraldi. Kui peame suurendama sĂŒsteemi lĂ€bilaskevĂ”imet, piisab, kui kĂ€ivitame rohkem teenuseid suuremal arvul serverites.
  • Kui saame teavet kasutajalt, ei pea me tingimata ootama, kuni andmed tĂ€ielikult salvestatakse. Vastupidi, piisab, kui vastame "ok", ja alustada tööd jĂ€rk-jĂ€rgult. OotejĂ€rjekord tasandab ka tippe, kuna uue objekti lisamine toimub kiiresti ja kasutaja ei pea ootama, kuni kogu tsĂŒkkel on lĂ€bitud.
  • NĂ€iteks olen lisanud deduplication teenuse, mis proovib kokku liita sarnased failid. Kui see töötab pikka aega 1% juhtudel, siis klient ei mĂ€rka seda peaaegu ĂŒldse (vt ĂŒlal), mis on suur pluss, kuna meilt ei nĂ”uta enam sada protsenti kiirus ja usaldusvÀÀrsus.

Kuid kohe on nÀha ka miinuseid:

  • Meie sĂŒsteemil on kadunud range jĂ€rjepidevus. See tĂ€hendab, et kui nĂ€iteks tellida erinevaid teenuseid, siis teoreetiliselt vĂ”ib saada erineva oleku (kuna ĂŒks teenustest ei pruugi saada teate varasest jĂ€rjekorrast). Veel ĂŒhe tagajĂ€rjena pole sĂŒsteemil nĂŒĂŒd ĂŒhist aega. See tĂ€hendab, et ei saa, nĂ€iteks, kĂ”iki sĂŒndmusi lihtsalt saabumise aja jĂ€rgi sorteerida, kuna kellad serverite vahel ei pruugi olla sĂŒnkroonitud (veelgi enam, kahe serveri samaaegne aeg on utoopia).
  • Ükski sĂŒndmus ei saa nĂŒĂŒd lihtsalt tagasi vĂ”tta (nagu vĂ”iks andmebaasi puhul teha). Selle asemel tuleb lisada uus sĂŒndmus — compensation event, mis muudab viimase oleku soovitud seisundiks. NĂ€iteks sarnases valdkonnas: ilma ajaloos muutmist (mis on mĂ”nes mĂ”ttes halb) ei saa gitis commit'i tagasi pöörata, kuid saab teha erilise rollback commit'i, mis pĂ”himĂ”tteliselt lihtsalt taastab vana oleku. Kuid ajaloos jÀÀvad nii vale commit kui ka rollback alles.
  • Andmeskeem vĂ”ib muutuda versioonist versiooni, kuid vanu sĂŒndmusi ei saa nĂŒĂŒd uutele standarditele uuendada (sest sĂŒndmusi ei saa pĂ”himĂ”tteliselt muuta).

Nagu nĂ€ha, sobib Event Sourcing suurepĂ€raselt kokku CQRS-iga. Veelgi enam, sĂŒsteemi rakendamine tĂ”husate ja mugavate jĂ€rjekordadega, kuid ilma andmevoogude jagamiseta, on juba iseenesest keeruline, sest tuleb lisada sĂŒnkroniseerimispunkte, mis neutraliseerivad kĂ”ik jĂ€rjekordade positiivsed eelised. MĂ”lema lĂ€henemise samaaegsel rakendamisel tuleb programmi töö koodi kergelt kohandada. Meie puhul, kui fail serverisse saadetakse, tuleb vastuseks vaid „okei”, mis tĂ€hendab ainult seda, et „faili lisamise operatsioon on salvestatud”. Formaalset öeldes ei tĂ€henda see, et andmed on juba teistele seadmetele kergesti kĂ€ttesaadavad (nĂ€iteks ei pruugi deduplitseerimisteenus indeksit koheselt uuendada). Kuid mĂ”ne aja pĂ€rast saab klient teate stiilis „fail X on salvestatud”.

Tulemuseks:

  • Failide saatmise staatuste arv suureneb: klassikalise „fail saadetud” asemel saame kaks: „fail lisatud serveri jĂ€rjekorda” ja „fail salvestatud salvestusse”. Viimane tĂ€hendab, et teised seadmed saavad faili juba hakata vastu vĂ”tma (arvestades, et jĂ€rjekorrad töötavad erineva kiirusel).
  • Kuna saadetiste teave tuleb nĂŒĂŒd erinevate kanalite kaudu, peame leiutama lahendusi, et saada faili töötlemise staatust. Selle tulemusena: erinevalt klassikalisest request-response mudelist vĂ”ib klient failide töötlemise protsessis taaskĂ€ivituda, kuid selle töötlemise staatuse tĂ€psus jÀÀb sĂ€ilima. Ja see punkt töötab, pĂ”himĂ”tteliselt, kohe vĂ€lja pakutud lahendusena. SeetĂ”ttu oleme nĂŒĂŒd tĂ”rketele tolerantsemad.

Sharding

Nagu eelnevalt kirjeldatud, puudub event sourcing sĂŒsteemides range kooskĂ”la. See tĂ€hendab, et vĂ”ime kasutada mitmeid andmehoidlaid ilma nende vahelise sĂŒnkroniseerimiseta. LĂ€henedes meie ĂŒlesandele, saame:

  • Jagada faile tĂŒĂŒpide jĂ€rgi. NĂ€iteks saab pilte/videot dekodeerida ja valida efektiivseima formaadi.
  • Jagada kontosid riikide lĂ”ikes. Paljude seaduste tĂ”ttu vĂ”ib see osutuda vajalikuks, kuid see arhitektuuri skeem annab sellise vĂ”imaluse automaatselt.

Mugavad arhitektuurilised mustrid

Kui soovite andmeid ĂŒhest salvestuspunktist teise viia, siis on standardsete vahenditega seda raske teha. Kahjuks tuleb sellisel juhul jĂ€rjekord peatada, migratsioon teostada ja seejĂ€rel uuesti kĂ€ivitada. Üldiselt pole andmete edastamine „reaalajas” vĂ”imalik, kuid kui sĂŒndmuste jĂ€rjekord on tĂ€ielikult sĂ€ilitatud ja teil on varasemate salvestuspunktide kopeerimised, saame sĂŒndmusi jĂ€rgmiselt uuesti mĂ€ngida:

  • Event Source'is on igal sĂŒndmusel oma identifikaator (ideaalis mitte vĂ€henemas). Seega saame salvestusse lisada vĂ€lja — viimane töödeldud elemendi id.
  • Kopeerime jĂ€rjekorra, et kĂ”ik sĂŒndmused saaksid töötlemiseks minna mitmesse sĂ”ltumatusse salvestusse (esimene on see, kus andmed juba on, ja teine on uus, kuid hetkel tĂŒhi). Loomulikult ei töötle me teist jĂ€rjekorda veel.
  • KĂ€ivitame teise jĂ€rjekorra (ehk alustame sĂŒndmuste uuesti mĂ€ngimist).
  • Kui uus jĂ€rjekord on suhteliselt tĂŒhi (st elementide lisamise ja nende Ă€ravĂ”tmise vaheline keskmine ajavahemik on vastuvĂ”etav), on vĂ”imalik hakata lugemisprotsesse suunama uuele salvestusele.

Kuidas nĂ€ha, ei ole meie sĂŒsteemis kunagi olnud ja ei ole ka ranget ĂŒhtsust. On ainult eventual consistency, mis tĂ€hendab, et sĂŒndmusi töödeldakse samas jĂ€rjekorras (kuid vĂ”imaliku erineva viivitusega). Kasutades seda, saame suhteliselt lihtsalt andmeid ĂŒle kanda ilma sĂŒsteemi seiskamiseta teise maailma otsa.

Seega, jÀtkates meie nÀidet veebifailide salvestamisest, annab selline arhitektuur meile juba mitu eelist:

  • Saame liigutada objekte lĂ€hemale kasutajatele, ja seda dĂŒnaamiliselt. SeelĂ€bi on vĂ”imalik teenuse kvaliteeti parandada.
  • Saame hoida osa andmeid ettevĂ”tete sees. NĂ€iteks nĂ”uavad ettevĂ”tte kasutajad sageli, et nende andmed salvestataks kontrollitavates andmekeskustes (andmete lekete vĂ€ltimiseks). Sharding abil saame seda hĂ”lpsasti toetada. Ja ĂŒlesanne muutub veelgi lihtsamaks, kui kliendil on ĂŒhilduv pilv (nĂ€iteks, Azure self hosted).
  • Oluline on mĂ€rkida, et me ei pea seda kindlasti tegema. Alguses piisab meile ĂŒhest salvest, et alustada kĂ”igi kontode haldamist (et saaksime vĂ”imalikult kiiresti tööle hakata). Selle sĂŒsteemi peamine omadus on lihtsus, kuigi see on laiendatav. Ei ole vaja kohe kirjutada koodi, mis töötab miljoni eraldi iseseisva jĂ€rjekorraga jne. Kui tulevikus on vajadus, saab seda alati teha.

Statiline sisu hostimine

See punkt vÔib tunduda iseenesestmÔistetav, kuid see on vajalik enam-vÀhem standardse koormatud rakenduse jaoks. Idee on lihtne: kogu statiline sisu edastatakse mitte samalt serverilt, kus rakendus asub, vaid spetsiaalsetelt serveritelt, mis on selleks otstarbeks ette nÀhtud. Seega toimuvad need operatsioonid kiiremini (nÀiteks nginx edastab faile kiiremini ja odavamalt kui Java-server). Lisaks vÔimaldab CDN-arkitektuur (Sisu edastamise vÔrk) paigutada meie failid lÀhemale lÔppkasutajatele, mis paraneb teenuse kasutusmugavus.

Lihtsam ja standardne nĂ€ide staatilisest sisust on komplekt skripte ja pilte veebisaidi jaoks. Nendega on kĂ”ik lihtne — need on ette teada, seejĂ€rel arhiiv laaditakse CDN-serveritesse, kust see edastatakse lĂ”pptarbijatele.

Kuid tegelikkuses saab staatilise sisu puhul kasutada lĂ€henemist, mis sarnaneb lambdanike arhitektuurile. Tagasi meie ĂŒlesande juurde (failide veebihoiustamine), kus peame failid kasutajatele jagama. Lihtsaim lahendus on luua teenus, mis igas kasutaja pĂ€ringus teeb kĂ”ik vajalikud kontrollid (autentimine jne), ja seejĂ€rel laadib faili otse meie hoidlast. Sellise lĂ€henemise peamine miinus on see, et staatiline sisu (ja fail teatud revisjoniga on sisuliselt staatiline sisu) jagatakse samalt serverilt, mis sisaldab Ă€riloogikat. Selle asemel vĂ”iks kasutada jĂ€rgmist skeemi:

  • Server vĂ€ljastab allalaadimise URL-i. See vĂ”ib olla kujul file_id + key, kus key on mini-digitaalallkiri, mis annab Ă”iguse ressursile ligipÀÀsuks jĂ€rgmise pĂ€eva jooksul.
  • Failide jagamist teostab lihtne nginx jĂ€rgmiste valikute abil:
    • Sisu vahemĂ€lu. Kuna see teenus vĂ”ib asuda eraldi serveris, oleme ette valmistanud vĂ”imaluse salvestada kĂ”ik hiljuti allalaaditud failid kettale.
    • VĂ”tit kontrollitakse ĂŒhenduse loomise hetkel.
  • Valikuline: sisu voogesitus. NĂ€iteks, kui me tihendame kĂ”ik failid teenuses, on vĂ”imalik dekompressioon otse selles moodulis. SeetĂ”ttu tehakse IO operatsioonid seal, kus need kĂ”ige paremini sobivad. Java arhiivija vĂ”ib hĂ”lpsasti eraldada palju liigset mĂ€lu, kuid teenuse ĂŒmberkirjutamine Ă€riloogika jaoks tingimuslike Rust/C++ abil vĂ”ib samuti osutuda ebaefektiivseks. Meie puhul kasutame erinevaid protsesse (vĂ”i isegi teenuseid), seega on ÀÀrmiselt efektiivne eraldada Ă€riloogika ja IO operatsioonid.

Mugavad arhitektuurilised mustrid

Sarnane skeem ei ole vĂ€ga sarnane staatilise sisu jagamisele (kuna me ei laadita kogu staatilist paketti kuskile), kuid tĂ”epoolest tegeleb selline lĂ€henemine muutumatute andmete jagamisega. Veelgi enam, seda skeemi saab ĂŒldistada ka teiste juhtumite peale, kus sisu ei ole lihtsalt staatiline, vaid vĂ”ib olla esitatud muutumatute ja kustutamata plokkide komplektina (kuigi neid vĂ”ib lisada).

Veel aitab paar sĂ”na (nĂ€iteks): kui olete töötanud Jenkins'i vĂ”i TeamCity'ga, siis teate, et mĂ”lemad lahendused on kirjutatud Java's. Need on Java-protsessid, mis tegelevad nii ehituste orkestreerimise kui ka sisu haldusega. Eriti on neil mĂ”lemal ĂŒlesanded, nagu "edastada fail / kaust serverist". NĂ€iteks artefaktide vĂ€ljastamine, lĂ€htekoodi edastamine (kui agent ei laadi koodi otse allikast, vaid teeb seda server), juurdepÀÀs logidele. KĂ”ik need ĂŒlesanded erinevad IO-koormusest. Seega peab server, mis vastutab keerulise Ă€ri logika eest, suutma tĂ”husalt lĂ€bi lasta suuri andmepuhanguid. Ja mis kĂ”ige huvitavam, sellist operatsiooni saab delegeerida ka nginx’ile tĂ€pselt sama skeemi jĂ€rgi (ainus erinevus on see, et pĂ€ringusse tuleb lisada andmekiip).

Kuid kui pöörata tagasi meie sĂŒsteemi, siis nĂ€eme jĂ€rgmist skeemi:

Mugavad arhitektuurilised mustrid

Nagu nĂ€ha, on sĂŒsteem radikaalselt keerukamaks muutunud. See on nĂŒĂŒd mitte lihtsalt miniprotsess, mis salvestab faile kohapeal. NĂŒĂŒd on vajalikud mitte kĂ”ige lihtsamad toetused, API versiooni kontrollimine jne. SeetĂ”ttu, kui kĂ”ik diagrammid on valmis, on kĂ”ige parem ĂŒksikasjalikult hinnata, kas selliste kulude suurenemine on Ă”igustatud. Kui aga soovite, et sĂŒsteemi oleks vĂ”imalik laiendada (sealhulgas veelgi suurema arvu kasutajate toetamiseks), tuleks selliste lahendustega arvestada. Selle tulemusena on sĂŒsteem arhitektuuriliselt valmis tĂ€iendava koormuse jaoks (peaaegu iga komponent on kopeeritav horisontaalseks skaleerimiseks). SĂŒsteemi saab uuendada ilma selle peatamiseta (lihtsalt mĂ”ned operatsioonid vĂ”ivad vĂ€heke aeglustuda).

Nagu ma juba alguses ĂŒtlesin, on mitmed internetiteenused praegu suurenenud koormuse all. Ja mĂ”ned neist on lĂ”petanud korraliku töö. Sisuliselt on sĂŒsteemid ebaĂ”nnestunud just siis, kui Ă€ri peaks raha teenima. See tĂ€hendab, et selle asemel, et edasi lĂŒkata tarnimist vĂ”i pakkuda klientidele «planeerige tarne jĂ€rgnevate kuude jooksul», ĂŒtles sĂŒsteem lihtsalt «mine konkurentide juurde». Just see on madala jĂ”udluse hind: kaotused toimuvad siis, kui kasum oleks kĂ”rgeim.

KokkuvÔte

Need lĂ€henemised on olnud tuntud ka varem. NĂ€iteks kasutab VK juba ammu Static Content Hosting ideed piltide edastamiseks. Paljud online-mĂ€ngud kasutavad mĂ€ngijate jagamiseks piirkondade vahel Sharding-skeemi vĂ”i mĂ€ngulokatsioonide eraldamiseks (kui maailm on ĂŒhtne). Event Sourcing lĂ€henemist kasutatakse aktiivselt e-posti puhul. Enamik kaubandusrakendusi, kuhu voolavad pidevalt andmed, on tegelikult ĂŒles ehitatud CQRS lĂ€henemisele, et filtreerida saadud andmeid. Ja horisontaalset skaleerimist on juba pikka aega rakendatud mitmes teenuses.

Kuid mis kĂ”ige tĂ€htsam, on need mustrid nĂŒĂŒdseks vĂ€ga kergesti rakendatavad kaasaegsetes rakendustes (kui need on kohased, muidugi). Pilved pakuvad sharding'u ja horisontaalset skaleerimist kohe, mis on palju lihtsam kui tellida erinevaid pĂŒhendatud servereid erinevates andmekeskustes iseseisvalt. CQRS on samuti muutunud palju lihtsamaks tĂ€nu raamatukogude arengule, nagu RX. KĂŒmme aastat tagasi suutis harva ĂŒkski veebisait sellist toetada. Ürituste allikas on samuti uskumatult lihtsalt seadistatav juba valmis konteinerite tĂ”ttu Apache Kafka'ga. KĂŒmme aastat tagasi oleks see olnud innovatsioon, nĂŒĂŒd on see argipĂ€ev. Samuti on staatilise sisu majutamine muutunud: tĂ€nu mugavamatest tehnoloogiatest (sealhulgas pĂ”hjaliku dokumentatsiooni ja suure vastuste andmebaasi olemasolu tĂ”ttu) on selline lĂ€henemine muutunud veelgi lihtsamaks.

KokkuvĂ”tteks, rida keeruliste arhitektuurimustrite rakendamine on nĂŒĂŒd palju lihtsam, seega tasub sellele eelnevalt tĂ€helepanu pöörata. Kui kĂŒmneaastasest rakendusest loobuti mĂ”nest eelnevalt nimetatud lahendusest kĂ”rgete rakendamise ja töökindluse kulude tĂ”ttu, siis nĂŒĂŒd, uues rakenduses vĂ”i pĂ€rast refaktooringut, on vĂ”imalik luua teenus, mis on arhitektuuri poolest nii laiendatav (tĂ”hususe mĂ”ttes) kui ka uutele klientide nĂ”udmistele valmis (nĂ€iteks isikuandmete lokaliseerimiseks).

Ja kĂ”ige tĂ€htsam: palun Ă€rge kasutage neid lĂ€henemisi, kui teil on lihtne rakendus. Jah, need on ilusad ja huvitavad, kuid saidi jaoks, mille tippaegne kĂŒlastatavus on 100 inimest, vĂ”ib sageli piirduda klassikalise monoliitse lahendusega (vĂ€hemalt vĂ€liselt, seestpoolt saab kĂ”ik jagada mooduliteks jne).

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster