{"id":80035,"date":"2020-05-02T13:42:54","date_gmt":"2020-05-02T11:42:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny"},"modified":"2020-05-02T13:42:54","modified_gmt":"2020-05-02T11:42:54","slug":"udobnye-arhitekturnye-patterny","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","title":{"rendered":"Mugavad arhitektuurilised mustrid","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere, Habr!<\/p>\n<p><\/p>\n<p>Seoses praeguste s\u00fcndmustega koroonaviiruse t\u00f5ttu on mitmed internetiteenused hakanud saama suuremat koormust. N\u00e4iteks, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.independent.co.uk\/life-style\/gadgets-and-tech\/news\/coronavirus-ocado-down-app-website-stockpiling-food-online-delivery-a9402216.html\">\u00fcks jaekettest Suurbritannias lihtsalt sulges oma veebisaidi tellimuste jaoks<\/a><\/noindex>, kuna ressursid said otsa. Ja kaugel sellest, et serverit saaks lihtsalt kiiremaks muuta, lisades v\u00f5imsamat varustust, peab klientide p\u00e4ringud siiski t\u00f6\u00f6tlema (v\u00f5i nad l\u00e4hevad konkurentide juurde).<\/p>\n<p><\/p>\n<p>Selles artiklis r\u00e4\u00e4gin l\u00fchidalt populaarsetest praktikatest, mis v\u00f5imaldavad luua kiire ja t\u00f5rkeennetuse teenuse. Kuid valitud arendusmoodulite seas on ainult need, millega praegu <strong>on lihtne \u00e4ra kasutada<\/strong>. Iga punkti jaoks on teil kas juba olemasolevad teegid v\u00f5i v\u00f5imalus probleem lahendada pilveteenuse abil.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"gorizontalnoe-masshtabirovanie\">Horiontaalne skaleerimine<\/h1>\n<p><\/p>\n<p>K\u00f5ige lihtsam ja k\u00f5igile tuntud punkt. \u00dcldiselt on k\u00f5ige sagedamini kaks koormuse jaotamise skeemi \u2014 horisontaalne ja vertikaalne skaleerimine. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C#%D0%93%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">Esimesel juhul<\/a><\/noindex> lubate teenustel t\u00f6\u00f6tada paralleelselt, jaotades seel\u00e4bi koormuse nende vahel. <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D1%83%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C#%D0%92%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BC%D0%B0%D1%81%D1%88%D1%82%D0%B0%D0%B1%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5\">Teisel<\/a><\/noindex> te tellite v\u00f5imsamaid servereid v\u00f5i optimeerite koodi.<\/p>\n<p><\/p>\n<p>N\u00e4iteks v\u00f5tan abstraktse pilveteenuse failide salvestamiseks, sarnase OwnCloudile, OneDrive'ile ja muudele.<\/p>\n<p><\/p>\n<p>Allpool on standardne diagramm sarnase s\u00fcsteemi kohta, kuid see demonstreerib vaid s\u00fcsteemi keerukust. Peame leidma viisi teenuste s\u00fcnkroonimiseks. Mis juhtub, kui kasutaja salvestab faili tahvelarvutisse ja soovib seda hiljem vaadata telefonist?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/7512c6d8783f5e0a38cc0861b01e54c8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nErinevus l\u00e4henemistes: vertikaalsel skaleerimisel oleme valmis suurendama s\u00f5lmede v\u00f5imsust, samas kui horisontaalsel lisame uusi s\u00f5lmi, et koormust jaotada.<\/p>\n<p><\/p>\n<h1 id=\"cqrs\">CQRS<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/martinfowler.com\/bliki\/CQRS.html\">Command Query Responsibility Segregation<\/a><\/noindex> on \u00fcsna oluline muster, kuna see v\u00f5imaldab erinevatel klientidel mitte ainult \u00fchenduda erinevate teenustega, vaid ka saada samu s\u00fcndmuste vooge. Selle eelised ei ole lihtsa rakenduse puhul nii ilmsed, kuid see on \u00e4\u00e4rmiselt oluline (ja lihtne) koormatud teenuse jaoks. Selle tuum: sisenevad ja v\u00e4ljuvad andmevood ei tohiks \u00fcksteist ristuda. See t\u00e4hendab, et te ei saa saata p\u00e4ringut ja oodata vastust, vaid saadate p\u00e4ringu teenusesse A, kuid saate vastuse teenuses B.<\/p>\n<p><\/p>\n<p>Selle l\u00e4henemise esimene eelis on v\u00f5imalus katkestada \u00fchendus (selle s\u00f5na laiemas t\u00e4henduses) pika k\u00fcsimise protsessi k\u00e4igus. Toome n\u00e4iteks enam-v\u00e4hem tavalise j\u00e4rjestuse:<\/p>\n<p><\/p>\n<ol>\n<li>Klient saatis palveli serverile.<\/li>\n<li>Server alustas pika t\u00f6\u00f6tlemisega.<\/li>\n<li>Server vastas kliendile tulemusega.<\/li>\n<\/ol>\n<p><\/p>\n<p>Kujutage ette, et punktis 2 toimus \u00fchenduse katkestamine (kas v\u00f5rgu uuendamine v\u00f5i kasutaja liikus teisele lehele, katkestades \u00fchenduse). Sel juhul on serveril keeruline saata vastust kasutajale, milline teave on k\u00e4ideldud. CQRS-i rakendades on j\u00e4rjestus pisut erinev:<\/p>\n<p><\/p>\n<ol>\n<li>Klient tellis v\u00e4rskendusi.<\/li>\n<li>Klient saatis palveli serverile.<\/li>\n<li>Server vastas 'p\u00e4ring vastu v\u00f5etud'.<\/li>\n<li>Server vastas tulemusega kanali kaudu punktist '1'.<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/8a00ea93eecc7cc0754122857c5f90d0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nagu n\u00e4ha, on skeem pisut keerukam. Veelgi enam, intuitiivne request-response l\u00e4henemine ei ole siin kohal. K\u00fcll aga on selge, et \u00fchenduse katkestamine p\u00e4ringu t\u00f6\u00f6tlemise k\u00e4igus ei too kaasa viga. Veelgi enam, kui kasutaja on tegelikult \u00fchendatud teenusega mitme seadme kaudu (n\u00e4iteks mobiiltelefoni ja tahvelarvuti kaudu), saab korraldada nii, et vastus j\u00f5uaks m\u00f5lemasse seadmesse.<\/p>\n<p><\/p>\n<p>Huvitav on see, et sissetulevate s\u00f5numite t\u00f6\u00f6tlemise kood on \u00fchesugune (mitte 100%) nii klientide poolt m\u00f5jutatud s\u00fcndmuste kui ka teiste s\u00fcndmuste jaoks, sealhulgas teiste klientide s\u00fcndmuste jaoks.<\/p>\n<p><\/p>\n<p>Kuid tegelikkuses saame me lisaboonuseid seet\u00f5ttu, et \u00fchesuunalist voogu saab t\u00f6\u00f6delda funktsionaalses stiilis (kasutades RX ja analooge). Ja see on juba t\u00f5sine pluss, kuna p\u00f5him\u00f5tteliselt saab rakenduse teha t\u00e4iesti reaktiivseks, rakendades samas funktsionaalset l\u00e4henemist. Suurtele programmidele v\u00f5ib see m\u00e4rkimisv\u00e4\u00e4rselt s\u00e4\u00e4sta ressursse arendamisel ja hooldamisel.<\/p>\n<p><\/p>\n<p>Kui kombineerida see l\u00e4henemine horisontaalse skaleerimisega, siis saadame me soovi korral p\u00e4ringud \u00fchele serverile ja saame vastused teisest. Seega saab klient ise valida endale sobiva teenuse, samas kui s\u00fcsteem suudab sisemiselt s\u00fcndmusi \u00f5igesti t\u00f6\u00f6delda.<\/p>\n<p><\/p>\n<h1 id=\"event-sourcing\">Event Sourcing<\/h1>\n<p><\/p>\n<p>Nagu teate, on jaotatud s\u00fcsteemi \u00fcheks peamiseks omaduseks \u00fcldise aja ja \u00fchise kriitilise sektsiooni puudumine. \u00dche protsessi raames v\u00f5ite synchroniseerida (k\u00f5igi samade mutex'ite abil), mille jooksul olete kindel, et keegi teine ei t\u00e4ida seda koodi. Kuid jaotatud s\u00fcsteemi puhul on see ohtlik, kuna see toob kaasa kulutusi ning tapab kogu skaleeritavuse v\u00f5lu \u2014 k\u00f5ik komponendid peavad ikkagi ootama \u00fcksteist.<\/p>\n<p><\/p>\n<p>Seet\u00f5ttu saame olulise t\u00f5e \u2014 kiiret jaotatud s\u00fcsteemi ei saa synchroniseerida, kuna muidu v\u00e4hendame j\u00f5udlust. Teiselt poolt vajame sageli teatud komponentide j\u00e4rjepidevust. Selleks saab kasutada l\u00e4henemist <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">eventual consistency<\/a><\/noindex>, kus garanteeritakse, et andmete muutuste puudumisel teatud ajavahemiku jooksul p\u00e4rast viimast uuendust (\u201el\u00f5puks\u201d) tagastavad k\u00f5ik p\u00e4ringud viimane uuendatud v\u00e4\u00e4rtus.<\/p>\n<p><\/p>\n<p>Oluline on m\u00f5ista, et traditsiooniliste andmebaaside puhul rakendatakse sageli <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Consistency_model#Strict_consistency\">ranget j\u00e4rjepidevust<\/a><\/noindex>, kus iga s\u00f5lm omab samu andmeid (sarnast saavutatakse sageli siis, kui tehingut peetakse kehtivaks alles p\u00e4rast teise serveri vastust). Siiski on siin m\u00f5ned leevendused isoleerimise tasetest, kuid p\u00f5hikirjeldus j\u00e4\u00e4b samaks \u2014 te saate elada t\u00e4iesti koosk\u00f5lastatud maailmas.<\/p>\n<p><\/p>\n<p>Kuid naaseme algse \u00fclesande juurde. Kui osa s\u00fcsteemist saab ehitada <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">eventual consistency<\/a><\/noindex>, siis saab luua j\u00e4rgmise skeemi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/33c80be6bc33bd897ca9b9e5525f9ae8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selle l\u00e4henemise olulised omadused:<\/p>\n<p><\/p>\n<ul>\n<li>Iga tulev asi paneb \u00fchte j\u00e4rjekorda.<\/li>\n<li>K\u00fcsimuse t\u00f6\u00f6tlemise k\u00e4igus v\u00f5ib teenus samuti paigutada \u00fclesandeid teistesse j\u00e4rjekordadesse.<\/li>\n<li>Igal siseneval s\u00fcndmusel on identifikaator (mis on vajalik dedupikatsiooniks).<\/li>\n<li>\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 &quot;append only&quot;. \u0418\u0437 \u043d\u0435\u0451 \u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445.<\/li>\n<li>J\u00e4rjekord t\u00f6\u00f6tab FIFO skeemi alusel (vabandust tautoloogia p\u00e4rast). Kui on vajalik paralleelne t\u00e4itmine, siis tuleks \u00fchel etappidel objektid erinevatesse j\u00e4rjekordadesse \u00fcmber paigutada.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kordan, et vaatleme olukorda veebip\u00f5hise failihoiustamise s\u00fcsteemi. Sel juhul n\u00e4eb s\u00fcsteem umbes selline v\u00e4lja:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/b95efb29545dcde1db9432d12d00a1b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oluline on, et diagrammil olevad teenused ei t\u00e4henda tingimata eraldi serverit. Isegi protsess v\u00f5ib olla sama. Oluline on midagi muud: ideoloogiliselt on need asjad jagatud nii, et horisontaalne skaleerimine oleks h\u00f5lpsasti rakendatav.<\/p>\n<p><\/p>\n<p>Kahte kasutajat teenuseseade n\u00e4eb v\u00e4lja selline (teenused, mis on m\u00f5eldud erinevatele kasutajatele, on eristatud erinevate v\u00e4rvidega):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/4c4aadc8b9dd505c3ad743e69fee4fae.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sellise kombinatsiooni eelised:<\/p>\n<p><\/p>\n<ul>\n<li>Teabe t\u00f6\u00f6tlemise teenused on jagatud. Ootej\u00e4rjekorrad on samuti eraldi. Kui peame suurendama s\u00fcsteemi l\u00e4bilaskev\u00f5imet, piisab, kui k\u00e4ivitame rohkem teenuseid suuremal arvul serverites.<\/li>\n<li>Kui saame teavet kasutajalt, ei pea me tingimata ootama, kuni andmed t\u00e4ielikult salvestatakse. Vastupidi, piisab, kui vastame \"ok\", ja alustada t\u00f6\u00f6d j\u00e4rk-j\u00e4rgult. Ootej\u00e4rjekord tasandab ka tippe, kuna uue objekti lisamine toimub kiiresti ja kasutaja ei pea ootama, kuni kogu ts\u00fckkel on l\u00e4bitud.<\/li>\n<li>N\u00e4iteks olen lisanud deduplication teenuse, mis proovib kokku liita sarnased failid. Kui see t\u00f6\u00f6tab pikka aega 1% juhtudel, siis klient ei m\u00e4rka seda peaaegu \u00fcldse (vt \u00fclal), mis on suur pluss, kuna meilt ei n\u00f5uta enam sada protsenti kiirus ja usaldusv\u00e4\u00e4rsus.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kuid kohe on n\u00e4ha ka miinuseid:<\/p>\n<p><\/p>\n<ul>\n<li>Meie s\u00fcsteemil on kadunud range j\u00e4rjepidevus. See t\u00e4hendab, et kui n\u00e4iteks tellida erinevaid teenuseid, siis teoreetiliselt v\u00f5ib saada erineva oleku (kuna \u00fcks teenustest ei pruugi saada teate varasest j\u00e4rjekorrast). Veel \u00fche tagaj\u00e4rjena pole s\u00fcsteemil n\u00fc\u00fcd \u00fchist aega. See t\u00e4hendab, et ei saa, n\u00e4iteks, k\u00f5iki s\u00fcndmusi lihtsalt saabumise aja j\u00e4rgi sorteerida, kuna kellad serverite vahel ei pruugi olla s\u00fcnkroonitud (veelgi enam, kahe serveri samaaegne aeg on utoopia).<\/li>\n<li>\u00dckski s\u00fcndmus ei saa n\u00fc\u00fcd lihtsalt tagasi v\u00f5tta (nagu v\u00f5iks andmebaasi puhul teha). Selle asemel tuleb lisada uus s\u00fcndmus \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49451237\/compensating-events-on-cqrs-es-architecture\">compensation event<\/a><\/noindex>, mis muudab viimase oleku soovitud seisundiks. N\u00e4iteks sarnases valdkonnas: ilma ajaloos muutmist (mis on m\u00f5nes m\u00f5ttes halb) ei saa gitis commit'i tagasi p\u00f6\u00f6rata, kuid saab teha erilise <noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/docs\/git-revert\">rollback commit'i<\/a><\/noindex>, mis p\u00f5him\u00f5tteliselt lihtsalt taastab vana oleku. Kuid ajaloos j\u00e4\u00e4vad nii vale commit kui ka rollback alles.<\/li>\n<li>Andmeskeem v\u00f5ib muutuda versioonist versiooni, kuid vanu s\u00fcndmusi ei saa n\u00fc\u00fcd uutele standarditele uuendada (sest s\u00fcndmusi ei saa p\u00f5him\u00f5tteliselt muuta).<\/li>\n<\/ul>\n<p><\/p>\n<p>Nagu n\u00e4ha, sobib Event Sourcing suurep\u00e4raselt kokku CQRS-iga. Veelgi enam, s\u00fcsteemi rakendamine t\u00f5husate ja mugavate j\u00e4rjekordadega, kuid ilma andmevoogude jagamiseta, on juba iseenesest keeruline, sest tuleb lisada s\u00fcnkroniseerimispunkte, mis neutraliseerivad k\u00f5ik j\u00e4rjekordade positiivsed eelised. M\u00f5lema l\u00e4henemise samaaegsel rakendamisel tuleb programmi t\u00f6\u00f6 koodi kergelt kohandada. Meie puhul, kui fail serverisse saadetakse, tuleb vastuseks vaid \u201eokei\u201d, mis t\u00e4hendab ainult seda, et \u201efaili lisamise operatsioon on salvestatud\u201d. Formaalset \u00f6eldes ei t\u00e4henda see, et andmed on juba teistele seadmetele kergesti k\u00e4ttesaadavad (n\u00e4iteks ei pruugi deduplitseerimisteenus indeksit koheselt uuendada). Kuid m\u00f5ne aja p\u00e4rast saab klient teate stiilis \u201efail X on salvestatud\u201d.<\/p>\n<p><\/p>\n<p>Tulemuseks:<\/p>\n<p><\/p>\n<ul>\n<li>Failide saatmise staatuste arv suureneb: klassikalise \u201efail saadetud\u201d asemel saame kaks: \u201efail lisatud serveri j\u00e4rjekorda\u201d ja \u201efail salvestatud salvestusse\u201d. Viimane t\u00e4hendab, et teised seadmed saavad faili juba hakata vastu v\u00f5tma (arvestades, et j\u00e4rjekorrad t\u00f6\u00f6tavad erineva kiirusel).<\/li>\n<li>Kuna saadetiste teave tuleb n\u00fc\u00fcd erinevate kanalite kaudu, peame leiutama lahendusi, et saada faili t\u00f6\u00f6tlemise staatust. Selle tulemusena: erinevalt klassikalisest request-response mudelist v\u00f5ib klient failide t\u00f6\u00f6tlemise protsessis taask\u00e4ivituda, kuid selle t\u00f6\u00f6tlemise staatuse t\u00e4psus j\u00e4\u00e4b s\u00e4ilima. Ja see punkt t\u00f6\u00f6tab, p\u00f5him\u00f5tteliselt, kohe v\u00e4lja pakutud lahendusena. Seet\u00f5ttu oleme n\u00fc\u00fcd t\u00f5rketele tolerantsemad.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sharding\">Sharding<\/h1>\n<p><\/p>\n<p>Nagu eelnevalt kirjeldatud, puudub event sourcing s\u00fcsteemides range koosk\u00f5la. See t\u00e4hendab, et v\u00f5ime kasutada mitmeid andmehoidlaid ilma nende vahelise s\u00fcnkroniseerimiseta. L\u00e4henedes meie \u00fclesandele, saame:<\/p>\n<p><\/p>\n<ul>\n<li>Jagada faile t\u00fc\u00fcpide j\u00e4rgi. N\u00e4iteks saab pilte\/videot dekodeerida ja valida efektiivseima formaadi.<\/li>\n<li>Jagada kontosid riikide l\u00f5ikes. Paljude seaduste t\u00f5ttu v\u00f5ib see osutuda vajalikuks, kuid see arhitektuuri skeem annab sellise v\u00f5imaluse automaatselt.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/dd310df700bc39c014d0105a3425fece.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kui soovite andmeid \u00fchest salvestuspunktist teise viia, siis on standardsete vahenditega seda raske teha. Kahjuks tuleb sellisel juhul j\u00e4rjekord peatada, migratsioon teostada ja seej\u00e4rel uuesti k\u00e4ivitada. \u00dcldiselt pole andmete edastamine \u201ereaalajas\u201d v\u00f5imalik, kuid kui s\u00fcndmuste j\u00e4rjekord on t\u00e4ielikult s\u00e4ilitatud ja teil on varasemate salvestuspunktide kopeerimised, saame s\u00fcndmusi j\u00e4rgmiselt uuesti m\u00e4ngida:<\/p>\n<p><\/p>\n<ul>\n<li>Event Source'is on igal s\u00fcndmusel oma identifikaator (ideaalis mitte v\u00e4henemas). Seega saame salvestusse lisada v\u00e4lja \u2014 viimane t\u00f6\u00f6deldud elemendi id.<\/li>\n<li>Kopeerime j\u00e4rjekorra, et k\u00f5ik s\u00fcndmused saaksid t\u00f6\u00f6tlemiseks minna mitmesse s\u00f5ltumatusse salvestusse (esimene on see, kus andmed juba on, ja teine on uus, kuid hetkel t\u00fchi). Loomulikult ei t\u00f6\u00f6tle me teist j\u00e4rjekorda veel.<\/li>\n<li>K\u00e4ivitame teise j\u00e4rjekorra (ehk alustame s\u00fcndmuste uuesti m\u00e4ngimist).<\/li>\n<li>Kui uus j\u00e4rjekord on suhteliselt t\u00fchi (st elementide lisamise ja nende \u00e4rav\u00f5tmise vaheline keskmine ajavahemik on vastuv\u00f5etav), on v\u00f5imalik hakata lugemisprotsesse suunama uuele salvestusele.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kuidas n\u00e4ha, ei ole meie s\u00fcsteemis kunagi olnud ja ei ole ka ranget \u00fchtsust. On ainult eventual consistency, mis t\u00e4hendab, et s\u00fcndmusi t\u00f6\u00f6deldakse samas j\u00e4rjekorras (kuid v\u00f5imaliku erineva viivitusega). Kasutades seda, saame suhteliselt lihtsalt andmeid \u00fcle kanda ilma s\u00fcsteemi seiskamiseta teise maailma otsa.<\/p>\n<p><\/p>\n<p>Seega, j\u00e4tkates meie n\u00e4idet veebifailide salvestamisest, annab selline arhitektuur meile juba mitu eelist:<\/p>\n<p><\/p>\n<ul>\n<li>Saame liigutada objekte l\u00e4hemale kasutajatele, ja seda d\u00fcnaamiliselt. Seel\u00e4bi on v\u00f5imalik teenuse kvaliteeti parandada. <\/li>\n<li>Saame hoida osa andmeid ettev\u00f5tete sees. N\u00e4iteks n\u00f5uavad ettev\u00f5tte kasutajad sageli, et nende andmed salvestataks kontrollitavates andmekeskustes (andmete lekete v\u00e4ltimiseks). Sharding abil saame seda h\u00f5lpsasti toetada. Ja \u00fclesanne muutub veelgi lihtsamaks, kui kliendil on \u00fchilduv pilv (n\u00e4iteks, <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/en-gb\/azure-stack\/asdk\/asdk-what-is?view=azs-1910\">Azure self hosted<\/a><\/noindex>).<\/li>\n<li>Oluline on m\u00e4rkida, et me ei pea seda kindlasti tegema. Alguses piisab meile \u00fchest salvest, et alustada k\u00f5igi kontode haldamist (et saaksime v\u00f5imalikult kiiresti t\u00f6\u00f6le hakata). Selle s\u00fcsteemi peamine omadus on lihtsus, kuigi see on laiendatav. Ei ole vaja kohe kirjutada koodi, mis t\u00f6\u00f6tab miljoni eraldi iseseisva j\u00e4rjekorraga jne. Kui tulevikus on vajadus, saab seda alati teha.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"static-content-hosting\">Statiline sisu hostimine<\/h1>\n<p><\/p>\n<p>See punkt v\u00f5ib tunduda iseenesestm\u00f5istetav, kuid see on vajalik enam-v\u00e4hem 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\u00e4htud. Seega toimuvad need operatsioonid kiiremini (n\u00e4iteks nginx edastab faile kiiremini ja odavamalt kui Java-server). Lisaks v\u00f5imaldab CDN-arkitektuur (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Content_delivery_network\">Sisu edastamise v\u00f5rk<\/a><\/noindex>) paigutada meie failid l\u00e4hemale l\u00f5ppkasutajatele, mis paraneb teenuse kasutusmugavus.<\/p>\n<p><\/p>\n<p>Lihtsam ja standardne n\u00e4ide staatilisest sisust on komplekt skripte ja pilte veebisaidi jaoks. Nendega on k\u00f5ik lihtne \u2014 need on ette teada, seej\u00e4rel arhiiv laaditakse CDN-serveritesse, kust see edastatakse l\u00f5pptarbijatele.<\/p>\n<p><\/p>\n<p>Kuid tegelikkuses saab staatilise sisu puhul kasutada l\u00e4henemist, mis sarnaneb lambdanike arhitektuurile. Tagasi meie \u00fclesande juurde (failide veebihoiustamine), kus peame failid kasutajatele jagama. Lihtsaim lahendus on luua teenus, mis igas kasutaja p\u00e4ringus teeb k\u00f5ik vajalikud kontrollid (autentimine jne), ja seej\u00e4rel laadib faili otse meie hoidlast. Sellise l\u00e4henemise peamine miinus on see, et staatiline sisu (ja fail teatud revisjoniga on sisuliselt staatiline sisu) jagatakse samalt serverilt, mis sisaldab \u00e4riloogikat. Selle asemel v\u00f5iks kasutada j\u00e4rgmist skeemi:<\/p>\n<p><\/p>\n<ul>\n<li>Server v\u00e4ljastab allalaadimise URL-i. See v\u00f5ib olla kujul file_id + key, kus key on mini-digitaalallkiri, mis annab \u00f5iguse ressursile ligip\u00e4\u00e4suks j\u00e4rgmise p\u00e4eva jooksul.<\/li>\n<li>Failide jagamist teostab lihtne nginx j\u00e4rgmiste valikute abil:\n<ul>\n<li>Sisu vahem\u00e4lu. Kuna see teenus v\u00f5ib asuda eraldi serveris, oleme ette valmistanud v\u00f5imaluse salvestada k\u00f5ik hiljuti allalaaditud failid kettale.<\/li>\n<li>V\u00f5tit kontrollitakse \u00fchenduse loomise hetkel.<\/li>\n<\/ul>\n<\/li>\n<li>Valikuline: sisu voogesitus. N\u00e4iteks, kui me tihendame k\u00f5ik failid teenuses, on v\u00f5imalik dekompressioon otse selles moodulis. Seet\u00f5ttu tehakse IO operatsioonid seal, kus need k\u00f5ige paremini sobivad. Java arhiivija v\u00f5ib h\u00f5lpsasti eraldada palju liigset m\u00e4lu, kuid teenuse \u00fcmberkirjutamine \u00e4riloogika jaoks tingimuslike Rust\/C++ abil v\u00f5ib samuti osutuda ebaefektiivseks. Meie puhul kasutame erinevaid protsesse (v\u00f5i isegi teenuseid), seega on \u00e4\u00e4rmiselt efektiivne eraldada \u00e4riloogika ja IO operatsioonid.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/4dead07d5824938e09b986192ccc8f5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sarnane skeem ei ole v\u00e4ga sarnane staatilise sisu jagamisele (kuna me ei laadita kogu staatilist paketti kuskile), kuid t\u00f5epoolest tegeleb selline l\u00e4henemine muutumatute andmete jagamisega. Veelgi enam, seda skeemi saab \u00fcldistada ka teiste juhtumite peale, kus sisu ei ole lihtsalt staatiline, vaid v\u00f5ib olla esitatud muutumatute ja kustutamata plokkide komplektina (kuigi neid v\u00f5ib lisada).<\/p>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0435\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 (\u0434\u043b\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0438\u044f): \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441 Jenkins\/TeamCity, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u043e\u0431\u0430 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 Java. \u041e\u0431\u0430 \u043e\u043d\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 Java-\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0431\u0438\u043b\u0434\u043e\u0432, \u0442\u0430\u043a \u0438 \u043c\u0435\u043d\u0435\u0434\u0436\u043c\u0435\u043d\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430. \u0412 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0443 \u043d\u0438\u0445 \u043e\u0431\u043e\u0438\u0445 \u0435\u0441\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u0438\u0434\u0430 &quot;\u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b\/\u043f\u0430\u043f\u043a\u0443 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430&quot;. \u041a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440: \u0432\u044b\u0434\u0430\u0447\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 (\u043a\u043e\u0433\u0434\u0430 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u0434 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0430 \u0437\u0430 \u043d\u0435\u0433\u043e \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440), \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043b\u043e\u0433\u0430\u043c. \u0412\u0441\u0435 \u044d\u0442\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043d\u0430 IO. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u0441\u043b\u043e\u0436\u043d\u0443\u044e \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0443, \u0437\u0430\u043e\u0434\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0431\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u0418 \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u043f\u043e\u0434\u043e\u0431\u043d\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043c\u0443 \u0436\u0435 nginx&#8217;\u0443 \u043f\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0439 \u0436\u0435 \u0441\u0445\u0435\u043c\u0435 (\u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0432 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043b\u044e\u0447 \u0434\u0430\u043d\u043d\u044b\u0445).<\/p>\n<p><\/p>\n<p>Kuid kui p\u00f6\u00f6rata tagasi meie s\u00fcsteemi, siis n\u00e4eme j\u00e4rgmist skeemi:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuurilised mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/97cfbf5daaa6678a9eecc3169692f0fc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nagu n\u00e4ha, on s\u00fcsteem radikaalselt keerukamaks muutunud. See on n\u00fc\u00fcd mitte lihtsalt miniprotsess, mis salvestab faile kohapeal. N\u00fc\u00fcd on vajalikud mitte k\u00f5ige lihtsamad toetused, API versiooni kontrollimine jne. Seet\u00f5ttu, kui k\u00f5ik diagrammid on valmis, on k\u00f5ige parem \u00fcksikasjalikult hinnata, kas selliste kulude suurenemine on \u00f5igustatud. Kui aga soovite, et s\u00fcsteemi oleks v\u00f5imalik laiendada (sealhulgas veelgi suurema arvu kasutajate toetamiseks), tuleks selliste lahendustega arvestada. Selle tulemusena on s\u00fcsteem arhitektuuriliselt valmis t\u00e4iendava koormuse jaoks (peaaegu iga komponent on kopeeritav horisontaalseks skaleerimiseks). S\u00fcsteemi saab uuendada ilma selle peatamiseta (lihtsalt m\u00f5ned operatsioonid v\u00f5ivad v\u00e4heke aeglustuda).<\/p>\n<p><\/p>\n<p>Nagu ma juba alguses \u00fctlesin, on mitmed internetiteenused praegu suurenenud koormuse all. Ja m\u00f5ned neist on l\u00f5petanud korraliku t\u00f6\u00f6. Sisuliselt on s\u00fcsteemid eba\u00f5nnestunud just siis, kui \u00e4ri peaks raha teenima. See t\u00e4hendab, et selle asemel, et edasi l\u00fckata tarnimist v\u00f5i pakkuda klientidele \u00abplaneerige tarne j\u00e4rgnevate kuude jooksul\u00bb, \u00fctles s\u00fcsteem lihtsalt \u00abmine konkurentide juurde\u00bb. Just see on madala j\u00f5udluse hind: kaotused toimuvad siis, kui kasum oleks k\u00f5rgeim.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h1>\n<p><\/p>\n<p>Need l\u00e4henemised on olnud tuntud ka varem. N\u00e4iteks kasutab VK juba ammu Static Content Hosting ideed piltide edastamiseks. Paljud online-m\u00e4ngud kasutavad m\u00e4ngijate jagamiseks piirkondade vahel Sharding-skeemi v\u00f5i m\u00e4ngulokatsioonide eraldamiseks (kui maailm on \u00fchtne). Event Sourcing l\u00e4henemist kasutatakse aktiivselt e-posti puhul. Enamik kaubandusrakendusi, kuhu voolavad pidevalt andmed, on tegelikult \u00fcles ehitatud CQRS l\u00e4henemisele, et filtreerida saadud andmeid. Ja horisontaalset skaleerimist on juba pikka aega rakendatud mitmes teenuses.<\/p>\n<p><\/p>\n<p>Kuid mis k\u00f5ige t\u00e4htsam, on need mustrid n\u00fc\u00fcdseks v\u00e4ga 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\u00fchendatud servereid erinevates andmekeskustes iseseisvalt. CQRS on samuti muutunud palju lihtsamaks t\u00e4nu raamatukogude arengule, nagu RX. K\u00fcmme aastat tagasi suutis harva \u00fckski veebisait sellist toetada. \u00dcrituste allikas on samuti uskumatult lihtsalt seadistatav juba valmis konteinerite t\u00f5ttu Apache Kafka'ga. K\u00fcmme aastat tagasi oleks see olnud innovatsioon, n\u00fc\u00fcd on see argip\u00e4ev. Samuti on staatilise sisu majutamine muutunud: t\u00e4nu mugavamatest tehnoloogiatest (sealhulgas p\u00f5hjaliku dokumentatsiooni ja suure vastuste andmebaasi olemasolu t\u00f5ttu) on selline l\u00e4henemine muutunud veelgi lihtsamaks.<\/p>\n<p><\/p>\n<p>Kokkuv\u00f5tteks, rida keeruliste arhitektuurimustrite rakendamine on n\u00fc\u00fcd palju lihtsam, seega tasub sellele eelnevalt t\u00e4helepanu p\u00f6\u00f6rata. Kui k\u00fcmneaastasest rakendusest loobuti m\u00f5nest eelnevalt nimetatud lahendusest k\u00f5rgete rakendamise ja t\u00f6\u00f6kindluse kulude t\u00f5ttu, siis n\u00fc\u00fcd, uues rakenduses v\u00f5i p\u00e4rast refaktooringut, on v\u00f5imalik luua teenus, mis on arhitektuuri poolest nii laiendatav (t\u00f5hususe m\u00f5ttes) kui ka uutele klientide n\u00f5udmistele valmis (n\u00e4iteks isikuandmete lokaliseerimiseks).<\/p>\n<p><\/p>\n<p>Ja k\u00f5ige t\u00e4htsam: palun \u00e4rge kasutage neid l\u00e4henemisi, kui teil on lihtne rakendus. Jah, need on ilusad ja huvitavad, kuid saidi jaoks, mille tippaegne k\u00fclastatavus on 100 inimest, v\u00f5ib sageli piirduda klassikalise monoliitse lahendusega (v\u00e4hemalt v\u00e4liselt, seestpoolt saab k\u00f5ik jagada mooduliteks jne).<\/p>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dbtc\/blog\/499758\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0430\u0439\u0442 \u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0418 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e (\u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0439\u0434\u0443\u0442 \u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c). \u0412 \u044d\u0442\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80036,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80035","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0430\u0439\u0442 \u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0418 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e (\u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0439\u0434\u0443\u0442 \u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c). \u0412 \u044d\u0442\u043e\u0439\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0430\u0439\u0442 \u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0418 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e (\u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0439\u0434\u0443\u0442 \u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c). \u0412 \u044d\u0442\u043e\u0439\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-02T11:42:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-02T11:42:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Mugavad arhitektuurimustrid | ProHoster","description":"Tere, Habr! Praeguses koroonaviiruse olukorras on mitmed internetiteenused saanud suurema koormuse. N\u00e4iteks katkestas \u00fcks Suurbritannia kaubanduskett oma veebisaidi, kuna v\u00f5imsus ei olnud piisav. Ja kaugeltki mitte alati ei saa serverit lihtsalt uue, v\u00f5imsama riistvara lisamisega kiiremaks muuta, kuid kliendip\u00e4ringud tuleb siiski t\u00f6\u00f6delda (vastasel juhul l\u00e4hevad nad konkurentidele). Sellega","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0423\u0434\u043e\u0431\u043d\u044b\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440! \u0412 \u0441\u0432\u0435\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0438\u0437-\u0437\u0430 \u043a\u043e\u0440\u043e\u043d\u0430\u0432\u0438\u0440\u0443\u0441\u0430 \u0440\u044f\u0434 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0441\u0442\u0430\u043b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u0443\u044e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u0412\u0435\u043b\u0438\u043a\u043e\u0431\u0440\u0438\u0442\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0441\u0430\u0439\u0442 \u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u0437\u0430\u043a\u0430\u0437\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0435\u0439. \u0418 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440, \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0431\u043e\u043b\u0435\u0435 \u043c\u043e\u0449\u043d\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0434\u043e (\u0438\u043b\u0438 \u043e\u043d\u0438 \u0443\u0439\u0434\u0443\u0442 \u043a \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c). \u0412 \u044d\u0442\u043e\u0439","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-02T11:42:54+00:00","article:modified_time":"2020-05-02T11:42:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80035","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:26:40","updated":"2022-09-28 01:38:29"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/80035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=80035"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/80035\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/80036"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=80035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=80035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=80035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}