Tere, Habr!
Praeguste koroonaviiruse tÔttu on mitmed veebiteenused hakanud saama suurenenud koormust. NÀiteks , kuna vÔimsus ei piisanud. Kuid mitte alati ei saa serverit kiirendada, lihtsalt lisades vÔimsamat riistvara, kuid kliendi pÀringud tuleb siiski töödelda (vÔi nad lahkuvad konkurentide juurde).
Selles artiklis rÀÀgin lĂŒhidalt populaarsetest praktikatest, mis vĂ”imaldavad luua kiire ja töökindla teenuse. Olen valinud ainult need arendusskeemid, millega on praegu lihtne tutvuda. Iga punkti jaoks on teil kas juba olemasolevad raamatukogud vĂ”i vĂ”imalus lahendada ĂŒlesanne pilveplatvormi abil.
Horisonitaalne skaleerimine
KĂ”ige lihtsam ja kĂ”igile tuntud punkt. Ăldiselt on kaks kĂ”ige levinumat koormuse jaotamise skeemi â horisonitaalne ja vertikaalne skaleerimine. lastakse teenustel töötada paralleelselt, jaotades seelĂ€bi koormuse nende vahel. tellite vĂ”imsamaid servereid vĂ”i optimeerite koodi.
NĂ€iteks vĂ”tan ma abstraktse pilvefailide salvestussĂŒsteemi, st mingi analooge OwnCloudile, OneDrive'ile ja nii edasi.
Allpool on standardne sarnase skeemi joonis, kuid see nĂ€itab vaid sĂŒsteemi keerukust. Peame kuidagi teenuseid sĂŒnkroniseerima. Mis juhtub, kui kasutaja salvestab faili tahvelarvutist ja soovib seda seejĂ€rel mobiilikĂ”nest vaadata?

LÀhenemiste vahe: vertikaalses skaleerimises oleme valmis sÔlmede vÔimsust suurendama, samas kui horisontraalses skaleerimises lisame uusi sÔlmi, et koormust jaotada.
CQRS
on ĂŒsna tĂ€htis muster, sest see vĂ”imaldab erinevatel klientidel mitte ainult ĂŒhendada erinevatel teenustel, vaid ka saada samasuguseid sĂŒndmuste vooge. Selle eelised pole lihtsa rakenduse jaoks nii selged, kuid see on ÀÀrmiselt tĂ€htis (ja lihtne) koormatud teenuse jaoks. Selle olemus: sisenevad ja vĂ€ljuvad andmevood ei tohiks kattuda. Te ei saa saata pĂ€ringut ja oodata vastust, selle asemel saadate pĂ€ringu teenusesse A, kuid saate vastuse teenusest B.
KĂ€esoleva lĂ€henemise esimene eelis on vĂ”imalus katkestada ĂŒhendus (sellest sĂ”nastuses) pika pĂ€ringu tĂ€itmise ajal. NĂ€iteks vĂ”tame enam-vĂ€hem standardse jĂ€rjestuse:
- Kliendilt saadeti pÀring serverisse.
- Server alustas pika töötlemisega.
- Server vastas kliendile tulemusega.
Kujutame ette, et punktis 2 toimus ĂŒhenduse katkestamine (vĂ”i vĂ”rk taaskĂ€ivitas, vĂ”i kasutaja liikus teisele lehele, katkestades ĂŒhenduse). Sellisel juhul on serveril keeruline saata vastust kasutajale teabega selle kohta, mis tegelikult töötati. CQRSi rakendamisel on jĂ€rjestus veidi erinev:
- Klient tellis vÀrskendused.
- Kliendilt saadeti pÀring serverisse.
- Server vastas "pÀring aktsepteeritud".
- Server vastas tulemusega punkti "1" kaudu.

Nagu nĂ€ha, on skeem veidi keerulisem. Veelgi enam, intuitiivne pĂ€ring-vastus lĂ€henemine puudub. Kuid nagu nĂ€ha, ei too ĂŒhenduse katkestamine pĂ€ringu töötlemise ajal kaasa viga. Veelgi enam, kui kasutaja on tegelikult ĂŒhendatud teenusega mitmest seadmest (nĂ€iteks mobiiltelefonist ja tahvelarvutist), on vĂ”imalik korraldada nii, et vastus tuleb mĂ”lemale seadmele.
Mis on huvitav, on see, et sissetulevate sĂ”numite töötlemise kood muutub sama (mitte 100%) nii klientide poolt mĂ”jutatud sĂŒndmuste kui ka teiste sĂŒndmuste jaoks, sealhulgas teiste klientide poolt.
Kuid tegelikult saame me lisaboonuseid seoses sellega, et ĂŒhesuunalist voogu on vĂ”imalik töödelda funktsionaalsti (kasutades RX ja analooge). Ja see on juba tĂ”sine eelis, kuna pĂ”himĂ”tteliselt saab rakenduse teha tĂ€ielikult reaktiivseks, kasutades samas funktsionaalset lĂ€henemist. Suuremate programmide jaoks vĂ”ib see oluliselt sÀÀsta arenduse ja hoolduse ressursse.
Kui kombineerite seda lĂ€henemist horisontaalse skaleerimisega, saame boonusena vĂ”imaluse saata pĂ€ringud ĂŒhe serveri kaudu, samas kui vastuseid saab teiselt. Seega vĂ”ib klient ise valida endale sobiva teenuse, kuid sĂŒsteem suudab ikkagi sĂŒndmusi Ă”igesti töödelda.
SĂŒndmuste allikaks
Nagu te teate, on jaotatud sĂŒsteemi ĂŒheks peamiseks omaduseks ĂŒhise aja ja ĂŒhise kriitilise sektsiooni puudumine. Ăhe protsessi puhul saate teha sĂŒnkroniseerimise (samade muteksitega), mille jooksul olete kindel, et keegi teine ei kĂ€ita seda koodi. Kuid jaotatud sĂŒsteemi jaoks on see ohtlik, kuna see toob kaasa kulusid ning hĂ€vitab skaaleerimise vĂ”lu â kĂ”iki komponente sunnitakse ikkagi ootama ĂŒht ja sama.
Seega saame olulise fakti â kiiret jaotatud sĂŒsteemi ei saa sĂŒnkroniseerida, sest siis vĂ€hendame tootlikkust. Teisest kĂŒljest on meil sageli vajaliku teatud komponentide kooskĂ”la. Ja selleks saame kasutada lĂ€henemist , kus garanteeritakse, et andmete muutuste puudumisel mingis ajavahemikus pĂ€rast viimast uuendamist (âlĂ”puksâ) tagastavad kĂ”ik pĂ€ringud viimase uuendatud vÀÀrtuse.
Oluline on mĂ”ista, et klassikalistes andmebaasides rakendatakse sageli , kus iga sĂ”lm omab samu andmeid (see saavutatakse sageli juhul, kui tehingut peetakse kehtivaks alles pĂ€rast teise serveri vastust). Siin on teatud leevendused isolatsioonitasemete tĂ”ttu, kuid ĂŒldine mĂ”te jÀÀb samaks â saate elada tĂ€ielikult kooskĂ”lastatud maailmas.
Kuid naaseme algse ĂŒlesande juurde. Kui osa sĂŒsteemist saab ehitada , siis saab luua jĂ€rgmise skeemi.

Selle lÀhenemise olulised omadused:
- Iga sissetulev pĂ€ring paigutatakse ĂŒhte jĂ€rjekorda.
- PĂ€ringu töötlemise kĂ€igus vĂ”ib teenus ka ĂŒlesandeid paigutada teistesse jĂ€rjekordadesse.
- Igal sissetulekul on identifikaator (mis on vajalik de-duplikatsiooniks).
- JĂ€rjekord töötab ideeliselt âappend onlyâ sĂŒsteemi kaudu. Sealt ei saa elemente kustutada ega ĂŒmber paigutada.
- JĂ€rjekord töötab FIFO skeemis (vabandust tautoloogia eest). Kui on vajalik samaaegne tĂ€itmine, tuleb ĂŒhel etapi kĂ€igus objektid erinevatesse jĂ€rjekordadesse ĂŒmber paigutada.
Tuletan meelde, et analĂŒĂŒsime veebipĂ”hise failide salvestamise juhtumit. Sel juhul nĂ€eb sĂŒsteem vĂ€lja umbes selline:

Oluline on see, et diagrammil olevad teenused ei tÀhenda tingimata eraldi serverit. Ka protsess vÔib olla sama. Oluline on hoopis see, et ideoloogiliselt on need asjad eraldatud nii, et horisontaalne skaleerimine oleks lihtne rakendada.
Kaks kasutajat saavad skeemi, kus teenused, mis on mÔeldud erinevatele kasutajatele, on erinevate vÀrvidega tÀhistatud:

Sellise kombinatsiooni boonused:
- Teabe töötlemise teenused on eraldatud. OotesĂŒsteemid on samuti eraldatud. Kui me peame suurendama sĂŒsteemi lĂ€bilaskevĂ”imet, piisab vaid rohkemate teenuste kĂ€ivitamisest suuremal arvul serverites.
- Kuna me saame teavet kasutajalt, ei pea me tingimata ootama, kuni andmed on tĂ€ielikult salvestatud. Vastupidi, me vĂ”ime vastata lihtsalt âokeiâ ja alustada tööd jĂ€rk-jĂ€rgult. Samuti sujuvdab ootesĂŒsteem tippe, kuna uue objekti lisamine toimub kiiresti ja kasutaja ei pea ootama kogu tsĂŒkli lĂ€bimist.
- NĂ€iteks lisasin teenuse deduplikatsiooni, mis ĂŒritab sama faili kokku liita. Kui see töötab pikka aega 1% juhtudest, ei pane klient seda peaaegu tĂ€hele (vt. ĂŒlal), mis on suur pluss, kuna meeltme nĂ”uda 100% kiirus ja usaldusvÀÀrsus.
Kuid koheselt paistavad vÀlja ka miinused:
- Meie sĂŒsteemil puudub rangelt kooskĂ”la. See tĂ€hendab, et kui nĂ€iteks liituda erinevate teenustega, vĂ”ib teoreetiliselt saada erineva seisundi (kuna ĂŒks teenus ei pruugi jĂ”uda teate vastuvĂ”tmiseni sisemisest ootesĂŒsteemist). Teise tagajĂ€rjena ei ole sĂŒsteemil enam ĂŒhtegi ĂŒhise aega. See tĂ€hendab, et nĂ€iteks ei saa kĂ”iki sĂŒndmusi jĂ€rjestada lihtsalt saabumise aja jĂ€rgi, kuna kellad serverite vahel ei pruugi olla sĂŒnkroonsed (veelgi enam, sama kellaaeg kahel serveril on utoopia).
- Ăkski sĂŒndmus ei saa nĂŒĂŒd lihtsalt tagasi vĂ”tta (nagu vĂ”iks teha andmebaasi puhul). Selle asemel on vajalik lisada uus sĂŒndmus â , mis muudab viimase seisundi vajalikuks. Sarnases valdkonnas nĂ€iteks: ilma ajalugu ĂŒmber kirjutamata (mis vĂ”ib olla halb mitmel juhul) ei saa gitis tagasipöördumist teha, kuid saab teha erilise , mis on sisuliselt lihtsalt vanema oleku taastamine. Siiski jÀÀb ajalukku nii vale commit kui ka rollback.
- Andmeskeem vĂ”ib muutuda versioonist versiooni, kuid vanade sĂŒndmuste uuendamine uue standardiga ei Ă”nnestu (kuna 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 eraldamiseta, on juba iseenesest keeruline, kuna tuleb lisada sĂŒnkroonimispunkte, mis vĂ€hendavad kogu jĂ€rjekordade positiivset mĂ”ju. Rakendades mĂ”lemat lĂ€henemist korraga, peab programmi töö kodeerimist veidi kohandama. Meie puhul, kui saadame faili serverisse, tuleb vastusena ainult 'ok', mis tĂ€hendab vaid, et 'faili lisamise operatsioon on salvestatud'. Formaalset see ei tĂ€henda, et andmed oleksid juba muudel seadmetel kĂ€ttesaadavad (nt deduplication teenus vĂ”ib indeksi ĂŒmber kohandada). Siiski, mĂ”ne aja pĂ€rast saab klient teadet stiilis 'fail X on salvestatud'.
Tulemuseks:
- Failide saatmise staatuste arv suureneb: klassikalise 'fail saadetud' asemel saame kaks: 'fail on lisatud serveri jÀrjekorda' ja 'fail on salvestatud salvestusse'. Viimane tÀhendab, et teised seadmed saavad faili juba alustada (arvestades, et jÀrjekorrad töötavad erineva kiirusel).
- Kuna teave saatmise kohta tuleb nĂŒĂŒd erinevate kanalite kaudu, peame vĂ€lja mĂ”tlema lahendused, et saada faili töötlemise staatus. Selle tagajĂ€rjel: erinevalt klassikalisest request-response mudelist vĂ”ib klient faili töötlemise ajal taaskĂ€ivituda, kuid selle töötlemise staatus jÀÀb Ă”igeteks. Ja see punkt töötab pĂ”himĂ”tteliselt karbist vĂ€lja. Tulemuseks: oleme nĂŒĂŒd tĂ”rgete suhtes tolerantsemad.
Sharding
Nagu eespool mainitud, puudub event sourcing sĂŒsteemides range kooskĂ”la. Seega saame kasutada mitmeid salvestusi ilma nende vahelise sĂŒnkroniseerimiseta. Meie ĂŒlesandele lĂ€henedes saame:
- Jagada faile tĂŒĂŒpide jĂ€rgi. NĂ€iteks pilte/ Videoid saab dekodeerida ja valida tĂ”husama vormingu.
- Jagab kontosid riikide jÀrgi. Paljude seaduste tÔttu vÔib see osutuda vajalikuks, kuid antud arhitektuuriline skeem annab selle vÔimaluse automaatselt.

Kui soovite andmeid ĂŒhest hoidlast teise viia, siis ei saa tavapĂ€raste vahenditega hakkama. Kahjuks on sel juhul vajalik peatada jĂ€rjekord, teha migreerimine ja seejĂ€rel kĂ€ivitada see uuesti. Ăldiselt ei saa andmeid "reĆŸiimis" ĂŒle kanda, kuid kui sĂŒndmuste jĂ€rjekord sĂ€ilitatakse tĂ€ielikult ja teil on eelneva oleku koopiad, siis saame sĂŒndmusi taasesitada jĂ€rgmiselt:
- Event Source'is on igal sĂŒndmusel oma identifikaator (ideaalis - mitte kahanev). Seega saame hoidlas lisada vĂ€lja - viimase töödeldud elemendi id.
- Kopeerime jĂ€rjekorra, et kĂ”ik sĂŒndmused saaksid töötlemiseks suunata mitu sĂ”ltumatut hoidlat (esimene on see, kus andmed praegu asuvad, ja teine on uus, kuid hetkel tĂŒhi). Teine jĂ€rjekord ei ole loomulikult praegu töödeldud.
- KĂ€ivitame teise jĂ€rjekorra (see tĂ€hendab, et alustame sĂŒndmuste taasesitamist).
- Kui uus jĂ€rjekord on suhteliselt tĂŒhi (st. keskmine erinevus aja osas elemendi lisamise ja selle vĂ€ljavĂ”tmise vahel on vastuvöetav), siis vĂ”ib hakata lugejaid suunama uude hoidlasse.
Kuidas nĂ€htud, ei ole meie sĂŒsteemis olnud ega ole ka ranget jĂ€rjepidevust. On olemas ainult eventual consistency, st. garantii, et sĂŒndmused töödeldakse sama jĂ€rjekorraga (kuid vĂ”imaliku erineva viivitusega). Kasutades seda, suudame andmeid suhteliselt kergesti ĂŒle kanda ilma sĂŒsteemi seiskamiseta teisele poole maakera.
Nii et jÀtkates meie nÀidet failide veebihoiust, annab sarnane arhitektuur meile juba mitmeid boonuseid:
- Saame objekti liikuda lĂ€hemale kasutajatele, dĂŒnaamiliselt. SeelĂ€bi saab parandada teenuse kvaliteeti.
- Saame hoida osa andmeid ettevĂ”tte sees. NĂ€iteks nĂ”uavad ettevĂ”tte kasutajad sageli, et nende andmed jÀÀksid kontrolli all olevatesse andmekeskustesse (andmelekkete vĂ€ltimiseks). TĂ”kestamise tĂ”ttu saame seda hĂ”lpsasti toetada. Ja ĂŒlesanne muutub veelgi lihtsamaks, kui kliendil on ĂŒhilduv pilv (nt. ).
- Ja kĂ”ige tĂ€htsam on, et me ei pea seda tegema. Alustuseks piisab meile ĂŒhest salvest, et alustada tööga kiiremini. Ja selle sĂŒsteemi peamine omadus on see, et kuigi see on laienev, on see algfaasis piisavalt lihtne. Lihtsalt pole vaja kohe kirjutada koodi, mis töötab miljoni eraldi iseseisva jĂ€rjekorraga jne. Kui see osutub vajalikuks, on seda vĂ”imalik tulevikus teha.
Kliendi staatilise sisu hostimine
Seda punkti vÔib pidada iseenesest mÔistetavaks, kuid see on siiski vajalik enam-vÀhem standardse koormusega rakenduse jaoks. Selle olemus on lihtne: kogu staatiline sisu jagatakse mitte samalt serverilt, kus rakendus asub, vaid spetsiaalsetelt, just selleks otstarbeks mÀÀratud serveritelt. Sellest tulenevalt toimub neid toiminguid kiiremini (nÀiteks nginx toimetab faile kiiremini ja odavamalt kui Java-server). Plussiks on, et CDN () arhitektuur vÔimaldab paigutada meie failid lÀhemale lÔppkasutajatele, mis avaldab positiivset mÔju teenusega töötamise mugavusele.
KĂ”ige lihtsam ja tavapĂ€rasem nĂ€ide staatilisest sisust on komplekt skripte ja pilte veebisaidile. Nende puhul on kĂ”ik lihtne â need on ette teada, seejĂ€rel arhiiv laaditakse ĂŒles CDN-serveritesse, kust neid jagatakse lĂ”ppkasutajatele.
Kuid tegelikult on staatilise sisu jaoks vÔimalik rakendada lÀhenemist, mis on midagi sarnast lambda-arhitektuurile. Tagasi keerukuse juurde (veebifailide salvestamine), kus meil on vaja jagada faile kasutajatele. Lihtsaim lahendus oleks luua teenus, mis iga kasutaja pÀringu jaoks teeb kÔik vajalikud kontrollid (autentimine jne), ja seejÀrel laadib faili otse meie salvestusest. Selle lÀhenemise peamine puudus on, et staatiline sisu (teatud versiooniga fail on pÔhimÔtteliselt staatiline sisu) jagatakse samalt serverilt, mis sisaldab Àriloogikat. Selle asemel saab luua jÀrgmise skeemi:
- Server vÀljastab allalaadimise URL-i. See vÔib olla kujul file_id + vÔti, kus vÔti on vÀike digitaalne allkiri, mis annab Ôiguse ressursile ligipÀÀsemiseks jÀrgmise 24 tunni jooksul.
- Faili edastamise eest hoolitseb lihtne nginx jÀrgmiste valikutega:
- Sisu kaevandamine. Kuna see teenus vÔib asuda eraldi serveris, oleme me endale jÀtnud tulevikuplaanid, et hoida kÔik hiljuti alla laaditud failid kettal.
- TĂ”emanus vĂ”tme kontrollimine ĂŒhenduse loomise ajal
- Valikuline: sisu voogedastus. NĂ€iteks, kui me tihendame kĂ”ik failid teenuses, siis saab dekompressiooni teha otse selles moodulis. SeetĂ”ttu IO operatsioonid toimuvad seal, kus need on vajalikud. Java arhiivija vĂ”ib kasutada palju lisa mĂ€lumahtu, kuid teenuse ĂŒmberkirjutamine Ă€ri loogikale kanti Rust / C++ vĂ”ib osutuda samuti ebaefektiivseks. Meie puhul kasutatakse erinevaid protsesse (vĂ”i isegi teenuseid), seega saab efektiivselt eristada Ă€ri loogikat ja IO operatsioone.

Selline skeem ei sarnane vÀga staatilise sisu jagamisega (kuna me ei lae kogu staatikat kuhugi), kuid reaalses elus tegeleb see lÀhenemine just muutumatute andmete jagamisega. Veelgi enam, seda skeemi saab laiendada ka teistele juhtumitele, kus sisu ei ole lihtsalt staatiline, vaid vÔib esitada muutumatute ja kustutamatute plokkidena (kuigi neid vÔib lisada).
Teise nĂ€itena (kinnitamiseks): kui olete töötanud Jenkins'i / TeamCity'ga, siis teate, et mĂ”lemad lahendused on kirjutatud Java-s. MĂ”lemad on Java-protsess, mis tegeleb nii buildide orkestreerimise kui ka sisu haldamisega. Eriti neil on ĂŒlesanded nagu 'edastada fail / kaust serverilt'. NĂ€iteks: artefaktide vĂ€ljastamine, allika koodi edastamine (kui agent ei laadi koodi otse hoidlast, vaid server teeb seda tema eest), juurdepÀÀs logidele. KĂ”ik need ĂŒlesanded erinevad IO koormusest. See tĂ€hendab, et server, mis vastutab keerulise Ă€ri loogika eest, peab suutma tĂ”husalt suunata suuri andmevoogusid. Ja mis kĂ”ige huvitavam, sellise operatsiooni saab delegaatsida sama nginx-i just selle sama skeemi kohaselt (vĂ€lja arvatud, et pĂ€ringule tuleb lisada andmevĂ”ti).
Kuid kui naasta meie sĂŒsteemi juurde, siis saame sellise skeemi:

Nagu nĂ€ha, on sĂŒsteem radikaalselt keerukamaks muutunud. See ei ole enam lihtsalt mini-protsess, mis salvestab faile kohapeal. NĂŒĂŒd on vajalik mitte kĂ”ige lihtsam tugi, API versioonide kontroll ja nii edasi. SeetĂ”ttu, pĂ€rast kĂ”igi diagrammide joonistamist, on kĂ”ige parem detailselt hinnata, kas sarnased kulud on Ă”igustatud. Kui soovite sĂŒsteemi laienemise vĂ”imalusi (sealhulgas suurenenud kasutajate arvu toetamiseks), peate kaaluma selliste lahenduste kasutuselevĂ”ttu. Kuid tulemuseks on see, et arhitektuuriline sĂŒsteem on valmis koormuse suurendamiseks (peaaegu iga komponent on vĂ”imalik horisontaalselt kloneerida). SĂŒsteemi saab uuendada selle peatamata (lihtsalt mĂ”ned toimingud aeglustuvad veidi).
Nagu ma juba alguses rÀÀkisin, on mitmed internetiteenused hakanud kogema suurenenud koormust. Ja mĂ”ned neist on lihtsalt lĂ”petanud korraliku töö. Tegelikult kukkusid sĂŒsteemid kokku just siis, kui Ă€ri peaks raha teenima. See tĂ€hendab, et asemel, et edasi lĂŒkata kohaletoimetamine, ning pakkuda klientidele 'planeerige kohaletoimetamist jĂ€rgmiste kuude jooksul', ĂŒtles sĂŒsteem lihtsalt 'minge konkurentide juurde'. See ongi madala jĂ”udluse hind: kaotused ilmnevad just siis, kui kasum oleks kĂ”rgeim.
KokkuvÔte
KĂ”ik need lĂ€henemisviisid on olnud juba varem tuntud. NĂ€iteks VK on juba ammu kasutanud staatilise sisu hostimise ideed piltide jagamiseks. Hulgaliselt veebimĂ€nge kasutavad fragmentimist (Sharding) mĂ€ngijate jagamiseks piirkondade vahel vĂ”i mĂ€ngukohtade jagamiseks (kui maailm on ĂŒhtne). Event sourcing lĂ€henemist kasutatakse aktiivselt e-posti teenustes. Enamik kauplejate rakendusi, kuhu voolab pidevalt andmeid, pĂ”hinevad tegelikult CQRS lĂ€henemisel, et saaks filtreerida saadud andmeid. Ja horisontaalset skaleerimist on juba pikka aega rakendatud paljudes teenustes.
Kuid kĂ”ige tĂ€htsam on see, et kĂ”iki neid mustreid on modernsetes rakendustes vĂ€ga lihtne rakendada (kui need on loomulikult asjakohased). Pilvandmed pakuvad Sharding'i ja horisontaalset skaleerimist koheselt, mis on oluliselt lihtsam kui tellida erinevaid eriservereid erinevates andmekeskustes iseseisvalt. CQRS on nĂŒĂŒd kergem, vĂ€hemalt tĂ€nu selliste raamatukogude arengule nagu RX. KĂŒmme aastat tagasi suutis harva ĂŒkski veebisait selliseid asju toetada. Event Sourcing'i seadistamine on samuti uskumatult lihtne tĂ€nu juba olemasolevatele konteineritele koos Apache Kafka'ga. KĂŒmme aastat tagasi oleks see olnud innovatsioon, nĂŒĂŒd on see igapĂ€evane praktika. Samuti ka staatilise sisu hostimine: mugavamate tehnoloogiate tĂ”ttu (sealhulgas pĂ”hjaliku dokumentatsiooni ja suure vastuste baasi olemasolu tĂ”ttu) on selline lĂ€henemine muutunud veelgi lihtsamaks.
KokkuvĂ”tteks, mitmete ĂŒsna keeruliste arhitektuurimustrite rakendamine on nĂŒĂŒd oluliselt lihtsam, mis tĂ€hendab, et sellele tasub varakult tĂ€helepanu pöörata. Kui kĂŒmne aasta vanuses rakenduses loobuti mĂ”nest ĂŒlalkirjeldatud lahendusest kĂ”rgete rakendamise ja hoolduskulude tĂ”ttu, siis nĂŒĂŒd, uues rakenduses vĂ”i pĂ€rast refaktorimist, on vĂ”imalik luua teenus, mis on arhitektuuriliselt nii skaleeritav (tĂ”hususe vaatenurgast) kui ka valmis klientide uute nĂ”udmiste jaoks (nĂ€iteks isikuandmete lokaliseerimiseks).
Ja kĂ”ige tĂ€htsam: palun Ă€rge kasutage neid lĂ€henemisviise, kui teil on lihtne rakendus. Jah, need on ilusad ja huvitavad, kuid saidile, mille tippkĂŒlastus on 100 inimest, vĂ”ib sageli piisata klassikalisest monoliidist (vĂ€hemalt vĂ€ljastpoolt, seestpoolt saab kĂ”ik mooduliteks jagada jne).
Allikas: habr.com
