{"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 arhitektuuri mustrid","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere, Habr!<\/p>\n<p><\/p>\n<p>Praeguste koroonaviiruse t\u00f5ttu on mitmed veebiteenused hakanud saama suurenenud 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 kaubandusketi veebisait Suurbritannias lihtsalt sulges oma veebipoe<\/a><\/noindex>, kuna v\u00f5imsus ei piisanud. Kuid mitte alati ei saa serverit kiirendada, lihtsalt lisades v\u00f5imsamat riistvara, kuid kliendi p\u00e4ringud tuleb siiski t\u00f6\u00f6delda (v\u00f5i nad lahkuvad konkurentide juurde).<\/p>\n<p><\/p>\n<p>Selles artiklis r\u00e4\u00e4gin l\u00fchidalt populaarsetest praktikatest, mis v\u00f5imaldavad luua kiire ja t\u00f6\u00f6kindla teenuse. Olen valinud ainult need arendusskeemid, millega on praegu <strong>lihtne tutvuda<\/strong>. Iga punkti jaoks on teil kas juba olemasolevad raamatukogud v\u00f5i v\u00f5imalus lahendada \u00fclesanne pilveplatvormi abil.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"gorizontalnoe-masshtabirovanie\">Horisonitaalne skaleerimine<\/h1>\n<p><\/p>\n<p>K\u00f5ige lihtsam ja k\u00f5igile tuntud punkt. \u00dcldiselt on kaks k\u00f5ige levinumat koormuse jaotamise skeemi \u2014 horisonitaalne 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\">Esimeses juhul<\/a><\/noindex> lastakse 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\">Teises<\/a><\/noindex> tellite v\u00f5imsamaid servereid v\u00f5i optimeerite koodi.<\/p>\n<p><\/p>\n<p>N\u00e4iteks v\u00f5tan ma abstraktse pilvefailide salvestuss\u00fcsteemi, st mingi analooge OwnCloudile, OneDrive'ile ja nii edasi.<\/p>\n<p><\/p>\n<p>Allpool on standardne sarnase skeemi joonis, kuid see n\u00e4itab vaid s\u00fcsteemi keerukust. Peame kuidagi teenuseid s\u00fcnkroniseerima. Mis juhtub, kui kasutaja salvestab faili tahvelarvutist ja soovib seda seej\u00e4rel mobiilik\u00f5nest vaadata?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/7512c6d8783f5e0a38cc0861b01e54c8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nL\u00e4henemiste vahe: vertikaalses skaleerimises oleme valmis s\u00f5lmede v\u00f5imsust suurendama, samas kui horisontraalses skaleerimises 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 t\u00e4htis muster, sest see v\u00f5imaldab erinevatel klientidel mitte ainult \u00fchendada erinevatel teenustel, vaid ka saada samasuguseid s\u00fcndmuste vooge. Selle eelised pole lihtsa rakenduse jaoks nii selged, kuid see on \u00e4\u00e4rmiselt t\u00e4htis (ja lihtne) koormatud teenuse jaoks. Selle olemus: sisenevad ja v\u00e4ljuvad andmevood ei tohiks kattuda. Te ei saa saata p\u00e4ringut ja oodata vastust, selle asemel saadate p\u00e4ringu teenusesse A, kuid saate vastuse teenusest B.<\/p>\n<p><\/p>\n<p>K\u00e4esoleva l\u00e4henemise esimene eelis on v\u00f5imalus katkestada \u00fchendus (sellest s\u00f5nastuses) pika p\u00e4ringu t\u00e4itmise ajal. N\u00e4iteks v\u00f5tame enam-v\u00e4hem standardse j\u00e4rjestuse:<\/p>\n<p><\/p>\n<ol>\n<li>Kliendilt saadeti p\u00e4ring serverisse.<\/li>\n<li>Server alustas pika t\u00f6\u00f6tlemisega.<\/li>\n<li>Server vastas kliendile tulemusega.<\/li>\n<\/ol>\n<p><\/p>\n<p>Kujutame ette, et punktis 2 toimus \u00fchenduse katkestamine (v\u00f5i v\u00f5rk taask\u00e4ivitas, v\u00f5i kasutaja liikus teisele lehele, katkestades \u00fchenduse). Sellisel juhul on serveril keeruline saata vastust kasutajale teabega selle kohta, mis tegelikult t\u00f6\u00f6tati. CQRSi rakendamisel on j\u00e4rjestus veidi erinev:<\/p>\n<p><\/p>\n<ol>\n<li>Klient tellis v\u00e4rskendused.<\/li>\n<li>Kliendilt saadeti p\u00e4ring serverisse.<\/li>\n<li>Server vastas \"p\u00e4ring aktsepteeritud\".<\/li>\n<li>Server vastas tulemusega punkti \"1\" kaudu.<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri 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 veidi keerulisem. Veelgi enam, intuitiivne p\u00e4ring-vastus l\u00e4henemine puudub. Kuid nagu n\u00e4ha, ei too \u00fchenduse katkestamine p\u00e4ringu t\u00f6\u00f6tlemise ajal kaasa viga. Veelgi enam, kui kasutaja on tegelikult \u00fchendatud teenusega mitmest seadmest (n\u00e4iteks mobiiltelefonist ja tahvelarvutist), on v\u00f5imalik korraldada nii, et vastus tuleb m\u00f5lemale seadmele.<\/p>\n<p><\/p>\n<p>Mis on huvitav, on see, et sissetulevate s\u00f5numite t\u00f6\u00f6tlemise kood muutub sama (mitte 100%) nii klientide poolt m\u00f5jutatud s\u00fcndmuste kui ka teiste s\u00fcndmuste jaoks, sealhulgas teiste klientide poolt.<\/p>\n<p><\/p>\n<p>Kuid tegelikult saame me lisaboonuseid seoses sellega, et \u00fchesuunalist voogu on v\u00f5imalik t\u00f6\u00f6delda funktsionaalsti (kasutades RX ja analooge). Ja see on juba t\u00f5sine eelis, kuna p\u00f5him\u00f5tteliselt saab rakenduse teha t\u00e4ielikult reaktiivseks, kasutades samas funktsionaalset l\u00e4henemist. Suuremate programmide jaoks v\u00f5ib see oluliselt s\u00e4\u00e4sta arenduse ja hoolduse ressursse.<\/p>\n<p><\/p>\n<p>Kui kombineerite seda l\u00e4henemist horisontaalse skaleerimisega, saame boonusena v\u00f5imaluse saata p\u00e4ringud \u00fche serveri kaudu, samas kui vastuseid saab teiselt. Seega v\u00f5ib klient ise valida endale sobiva teenuse, kuid s\u00fcsteem suudab ikkagi s\u00fcndmusi \u00f5igesti t\u00f6\u00f6delda.<\/p>\n<p><\/p>\n<h1 id=\"event-sourcing\">S\u00fcndmuste allikaks<\/h1>\n<p><\/p>\n<p>Nagu te teate, on jaotatud s\u00fcsteemi \u00fcheks peamiseks omaduseks \u00fchise aja ja \u00fchise kriitilise sektsiooni puudumine. \u00dche protsessi puhul saate teha s\u00fcnkroniseerimise (samade muteksitega), mille jooksul olete kindel, et keegi teine ei k\u00e4ita seda koodi. Kuid jaotatud s\u00fcsteemi jaoks on see ohtlik, kuna see toob kaasa kulusid ning h\u00e4vitab skaaleerimise v\u00f5lu \u2013 k\u00f5iki komponente sunnitakse ikkagi ootama \u00fcht ja sama.<\/p>\n<p><\/p>\n<p>Seega saame olulise fakti \u2013 kiiret jaotatud s\u00fcsteemi ei saa s\u00fcnkroniseerida, sest siis v\u00e4hendame tootlikkust. Teisest k\u00fcljest on meil sageli vajaliku teatud komponentide koosk\u00f5la. Ja selleks saame 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 mingis ajavahemikus p\u00e4rast viimast uuendamist (\u201el\u00f5puks\u201d) tagastavad k\u00f5ik p\u00e4ringud viimase uuendatud v\u00e4\u00e4rtuse.<\/p>\n<p><\/p>\n<p>Oluline on m\u00f5ista, et klassikalistes andmebaasides rakendatakse sageli <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Consistency_model#Strict_consistency\">ranget koosk\u00f5la<\/a><\/noindex>, kus iga s\u00f5lm omab samu andmeid (see saavutatakse sageli juhul, kui tehingut peetakse kehtivaks alles p\u00e4rast teise serveri vastust). Siin on teatud leevendused isolatsioonitasemete t\u00f5ttu, kuid \u00fcldine m\u00f5te j\u00e4\u00e4b samaks \u2013 saate elada t\u00e4ielikult 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 arhitektuuri 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 sissetulev p\u00e4ring paigutatakse \u00fchte j\u00e4rjekorda.<\/li>\n<li>P\u00e4ringu t\u00f6\u00f6tlemise k\u00e4igus v\u00f5ib teenus ka \u00fclesandeid paigutada teistesse j\u00e4rjekordadesse.<\/li>\n<li>Igal sissetulekul on identifikaator (mis on vajalik de-duplikatsiooniks).<\/li>\n<li>Oote ideoloogiliselt t\u00f6\u00f6tab skeemi \"append only\" j\u00e4rgi. Sealt ei saa elemente eemaldada ega neid \u00fcmber paigutada.<\/li>\n<li>J\u00e4rjekord t\u00f6\u00f6tab FIFO skeemis (vabandust tautoloogia eest). Kui on vajalik samaaegne t\u00e4itmine, tuleb \u00fchel etapi k\u00e4igus objektid erinevatesse j\u00e4rjekordadesse \u00fcmber paigutada.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tuletan meelde, et anal\u00fc\u00fcsime veebip\u00f5hise failide salvestamise juhtumit. Sel juhul n\u00e4eb s\u00fcsteem v\u00e4lja umbes selline:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/b95efb29545dcde1db9432d12d00a1b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Oluline on see, et diagrammil olevad teenused ei t\u00e4henda tingimata eraldi serverit. Ka protsess v\u00f5ib olla sama. Oluline on hoopis see, et ideoloogiliselt on need asjad eraldatud nii, et horisontaalne skaleerimine oleks lihtne rakendada.<\/p>\n<p><\/p>\n<p>Kaks kasutajat saavad skeemi, kus teenused, mis on m\u00f5eldud erinevatele kasutajatele, on erinevate v\u00e4rvidega t\u00e4histatud:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/4c4aadc8b9dd505c3ad743e69fee4fae.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Sellise kombinatsiooni boonused:<\/p>\n<p><\/p>\n<ul>\n<li>Teabe t\u00f6\u00f6tlemise teenused on eraldatud. Ootes\u00fcsteemid on samuti eraldatud. Kui me peame suurendama s\u00fcsteemi l\u00e4bilaskev\u00f5imet, piisab vaid rohkemate teenuste k\u00e4ivitamisest suuremal arvul serverites.<\/li>\n<li>Kuna me saame teavet kasutajalt, ei pea me tingimata ootama, kuni andmed on t\u00e4ielikult salvestatud. Vastupidi, me v\u00f5ime vastata lihtsalt \u201eokei\u201d ja alustada t\u00f6\u00f6d j\u00e4rk-j\u00e4rgult. Samuti sujuvdab ootes\u00fcsteem tippe, kuna uue objekti lisamine toimub kiiresti ja kasutaja ei pea ootama kogu ts\u00fckli l\u00e4bimist.<\/li>\n<li>N\u00e4iteks lisasin teenuse deduplikatsiooni, mis \u00fcritab sama faili kokku liita. Kui see t\u00f6\u00f6tab pikka aega 1% juhtudest, ei pane klient seda peaaegu t\u00e4hele (vt. \u00fclal), mis on suur pluss, kuna meeltme n\u00f5uda 100% kiirus ja usaldusv\u00e4\u00e4rsus.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kuid koheselt paistavad v\u00e4lja ka miinused:<\/p>\n<p><\/p>\n<ul>\n<li>Meie s\u00fcsteemil puudub rangelt koosk\u00f5la. See t\u00e4hendab, et kui n\u00e4iteks liituda erinevate teenustega, v\u00f5ib teoreetiliselt saada erineva seisundi (kuna \u00fcks teenus ei pruugi j\u00f5uda teate vastuv\u00f5tmiseni sisemisest ootes\u00fcsteemist). Teise tagaj\u00e4rjena ei ole s\u00fcsteemil enam \u00fchtegi \u00fchise aega. See t\u00e4hendab, et n\u00e4iteks ei saa k\u00f5iki s\u00fcndmusi j\u00e4rjestada lihtsalt saabumise aja j\u00e4rgi, kuna kellad serverite vahel ei pruugi olla s\u00fcnkroonsed (veelgi enam, sama kellaaeg kahel serveril on utoopia).<\/li>\n<li>\u00dckski s\u00fcndmus ei saa n\u00fc\u00fcd lihtsalt tagasi v\u00f5tta (nagu v\u00f5iks teha andmebaasi puhul). Selle asemel on vajalik 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 seisundi vajalikuks. Sarnases valdkonnas n\u00e4iteks: ilma ajalugu \u00fcmber kirjutamata (mis v\u00f5ib olla halb mitmel juhul) ei saa gitis tagasip\u00f6\u00f6rdumist teha, kuid saab teha erilise <noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/docs\/git-revert\">rollback commit<\/a><\/noindex>, mis on sisuliselt lihtsalt vanema oleku taastamine. Siiski j\u00e4\u00e4b ajalukku nii vale commit kui ka rollback.<\/li>\n<li>Andmeskeem v\u00f5ib muutuda versioonist versiooni, kuid vanade s\u00fcndmuste uuendamine uue standardiga ei \u00f5nnestu (kuna 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 eraldamiseta, on juba iseenesest keeruline, kuna tuleb lisada s\u00fcnkroonimispunkte, mis v\u00e4hendavad kogu j\u00e4rjekordade positiivset m\u00f5ju. Rakendades m\u00f5lemat l\u00e4henemist korraga, peab programmi t\u00f6\u00f6 kodeerimist veidi kohandama. Meie puhul, kui saadame faili serverisse, tuleb vastusena ainult 'ok', mis t\u00e4hendab vaid, et 'faili lisamise operatsioon on salvestatud'. Formaalset see ei t\u00e4henda, et andmed oleksid juba muudel seadmetel k\u00e4ttesaadavad (nt deduplication teenus v\u00f5ib indeksi \u00fcmber kohandada). Siiski, m\u00f5ne aja p\u00e4rast saab klient teadet stiilis 'fail X on salvestatud'.<\/p>\n<p><\/p>\n<p>Tulemuseks:<\/p>\n<p><\/p>\n<ul>\n<li>Failide saatmise staatuste arv suureneb: klassikalise 'fail saadetud' asemel saame kaks: 'fail on lisatud serveri j\u00e4rjekorda' ja 'fail on salvestatud salvestusse'. Viimane t\u00e4hendab, et teised seadmed saavad faili juba alustada (arvestades, et j\u00e4rjekorrad t\u00f6\u00f6tavad erineva kiirusel).<\/li>\n<li>Kuna teave saatmise kohta tuleb n\u00fc\u00fcd erinevate kanalite kaudu, peame v\u00e4lja m\u00f5tlema lahendused, et saada faili t\u00f6\u00f6tlemise staatus. Selle tagaj\u00e4rjel: erinevalt klassikalisest request-response mudelist v\u00f5ib klient faili t\u00f6\u00f6tlemise ajal taask\u00e4ivituda, kuid selle t\u00f6\u00f6tlemise staatus j\u00e4\u00e4b \u00f5igeteks. Ja see punkt t\u00f6\u00f6tab p\u00f5him\u00f5tteliselt karbist v\u00e4lja. Tulemuseks: oleme n\u00fc\u00fcd t\u00f5rgete suhtes tolerantsemad.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sharding\">Sharding<\/h1>\n<p><\/p>\n<p>Nagu eespool mainitud, puudub event sourcing s\u00fcsteemides range koosk\u00f5la. Seega saame kasutada mitmeid salvestusi ilma nende vahelise s\u00fcnkroniseerimiseta. Meie \u00fclesandele l\u00e4henedes saame:<\/p>\n<p><\/p>\n<ul>\n<li>Jagada faile t\u00fc\u00fcpide j\u00e4rgi. N\u00e4iteks pilte\/ Videoid saab dekodeerida ja valida t\u00f5husama vormingu.<\/li>\n<li>Jagab kontosid riikide j\u00e4rgi. Paljude seaduste t\u00f5ttu v\u00f5ib see osutuda vajalikuks, kuid antud arhitektuuriline skeem annab selle v\u00f5imaluse automaatselt.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri 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 hoidlast teise viia, siis ei saa tavap\u00e4raste vahenditega hakkama. Kahjuks on sel juhul vajalik peatada j\u00e4rjekord, teha migreerimine ja seej\u00e4rel k\u00e4ivitada see uuesti. \u00dcldiselt ei saa andmeid \"re\u017eiimis\" \u00fcle kanda, kuid kui s\u00fcndmuste j\u00e4rjekord s\u00e4ilitatakse t\u00e4ielikult ja teil on eelneva oleku koopiad, siis saame s\u00fcndmusi taasesitada j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ul>\n<li>Event Source'is on igal s\u00fcndmusel oma identifikaator (ideaalis - mitte kahanev). Seega saame hoidlas lisada v\u00e4lja - viimase t\u00f6\u00f6deldud elemendi id.<\/li>\n<li>Kopeerime j\u00e4rjekorra, et k\u00f5ik s\u00fcndmused saaksid t\u00f6\u00f6tlemiseks suunata mitu s\u00f5ltumatut hoidlat (esimene on see, kus andmed praegu asuvad, ja teine on uus, kuid hetkel t\u00fchi). Teine j\u00e4rjekord ei ole loomulikult praegu t\u00f6\u00f6deldud.<\/li>\n<li>K\u00e4ivitame teise j\u00e4rjekorra (see t\u00e4hendab, et alustame s\u00fcndmuste taasesitamist).<\/li>\n<li>Kui uus j\u00e4rjekord on suhteliselt t\u00fchi (st. keskmine erinevus aja osas elemendi lisamise ja selle v\u00e4ljav\u00f5tmise vahel on vastuv\u00f6etav), siis v\u00f5ib hakata lugejaid suunama uude hoidlasse.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kuidas n\u00e4htud, ei ole meie s\u00fcsteemis olnud ega ole ka ranget j\u00e4rjepidevust. On olemas ainult eventual consistency, st. garantii, et s\u00fcndmused t\u00f6\u00f6deldakse sama j\u00e4rjekorraga (kuid v\u00f5imaliku erineva viivitusega). Kasutades seda, suudame andmeid suhteliselt kergesti \u00fcle kanda ilma s\u00fcsteemi seiskamiseta teisele poole maakera.<\/p>\n<p><\/p>\n<p>Nii et j\u00e4tkates meie n\u00e4idet failide veebihoiust, annab sarnane arhitektuur meile juba mitmeid boonuseid:<\/p>\n<p><\/p>\n<ul>\n<li>Saame objekti liikuda l\u00e4hemale kasutajatele, d\u00fcnaamiliselt. Seel\u00e4bi saab parandada teenuse kvaliteeti. <\/li>\n<li>Saame hoida osa andmeid ettev\u00f5tte sees. N\u00e4iteks n\u00f5uavad ettev\u00f5tte kasutajad sageli, et nende andmed j\u00e4\u00e4ksid kontrolli all olevatesse andmekeskustesse (andmelekkete v\u00e4ltimiseks). T\u00f5kestamise t\u00f5ttu saame seda h\u00f5lpsasti toetada. Ja \u00fclesanne muutub veelgi lihtsamaks, kui kliendil on \u00fchilduv pilv (nt. <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>Ja k\u00f5ige t\u00e4htsam on, et me ei pea seda tegema. Alustuseks piisab meile \u00fchest salvest, et alustada t\u00f6\u00f6ga kiiremini. Ja selle s\u00fcsteemi peamine omadus on see, et kuigi see on laienev, on see algfaasis piisavalt lihtne. Lihtsalt pole vaja kohe kirjutada koodi, mis t\u00f6\u00f6tab miljoni eraldi iseseisva j\u00e4rjekorraga jne. Kui see osutub vajalikuks, on seda v\u00f5imalik tulevikus teha.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"static-content-hosting\">Kliendi staatilise sisu hostimine<\/h1>\n<p><\/p>\n<p>Seda punkti v\u00f5ib pidada iseenesest m\u00f5istetavaks, kuid see on siiski vajalik enam-v\u00e4hem standardse koormusega rakenduse jaoks. Selle olemus on lihtne: kogu staatiline sisu jagatakse mitte samalt serverilt, kus rakendus asub, vaid spetsiaalsetelt, just selleks otstarbeks m\u00e4\u00e4ratud serveritelt. Sellest tulenevalt toimub neid toiminguid kiiremini (n\u00e4iteks nginx toimetab faile kiiremini ja odavamalt kui Java-server). Plussiks on, et CDN (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Content_delivery_network\">Sisu edastamise v\u00f5rk<\/a><\/noindex>) arhitektuur v\u00f5imaldab paigutada meie failid l\u00e4hemale l\u00f5ppkasutajatele, mis avaldab positiivset m\u00f5ju teenusega t\u00f6\u00f6tamise mugavusele.<\/p>\n<p><\/p>\n<p>K\u00f5ige lihtsam ja tavap\u00e4rasem n\u00e4ide staatilisest sisust on komplekt skripte ja pilte veebisaidile. Nende puhul on k\u00f5ik lihtne \u2014 need on ette teada, seej\u00e4rel arhiiv laaditakse \u00fcles CDN-serveritesse, kust neid jagatakse l\u00f5ppkasutajatele.<\/p>\n<p><\/p>\n<p>Kuid tegelikult on staatilise sisu jaoks v\u00f5imalik rakendada l\u00e4henemist, 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\u00e4ringu jaoks teeb k\u00f5ik vajalikud kontrollid (autentimine jne), ja seej\u00e4rel laadib faili otse meie salvestusest. Selle l\u00e4henemise peamine puudus on, et staatiline sisu (teatud versiooniga fail on p\u00f5him\u00f5tteliselt staatiline sisu) jagatakse samalt serverilt, mis sisaldab \u00e4riloogikat. Selle asemel saab luua j\u00e4rgmise skeemi:<\/p>\n<p><\/p>\n<ul>\n<li>Server v\u00e4ljastab allalaadimise URL-i. See v\u00f5ib olla kujul file_id + v\u00f5ti, kus v\u00f5ti on v\u00e4ike digitaalne allkiri, mis annab \u00f5iguse ressursile ligip\u00e4\u00e4semiseks j\u00e4rgmise 24 tunni jooksul.<\/li>\n<li>Faili edastamise eest hoolitseb lihtne nginx j\u00e4rgmiste valikutega:\n<ul>\n<li>Sisu kaevandamine. Kuna see teenus v\u00f5ib asuda eraldi serveris, oleme me endale j\u00e4tnud tulevikuplaanid, et hoida k\u00f5ik hiljuti alla laaditud failid kettal.<\/li>\n<li>T\u00f5emanus v\u00f5tme kontrollimine \u00fchenduse loomise ajal<\/li>\n<\/ul>\n<\/li>\n<li>Valikuline: sisu voogedastus. N\u00e4iteks, kui me tihendame k\u00f5ik failid teenuses, siis saab dekompressiooni teha otse selles moodulis. Seet\u00f5ttu IO operatsioonid toimuvad seal, kus need on vajalikud. Java arhiivija v\u00f5ib kasutada palju lisa m\u00e4lumahtu, kuid teenuse \u00fcmberkirjutamine \u00e4ri loogikale kanti Rust \/ C++ v\u00f5ib osutuda samuti ebaefektiivseks. Meie puhul kasutatakse erinevaid protsesse (v\u00f5i isegi teenuseid), seega saab efektiivselt eristada \u00e4ri loogikat ja IO operatsioone.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri mustrid\" src=\"\/wp-content\/uploads\/2020\/05\/4dead07d5824938e09b986192ccc8f5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Selline skeem ei sarnane v\u00e4ga staatilise sisu jagamisega (kuna me ei lae kogu staatikat kuhugi), kuid reaalses elus tegeleb see l\u00e4henemine just muutumatute andmete jagamisega. Veelgi enam, seda skeemi saab laiendada ka teistele juhtumitele, kus sisu ei ole lihtsalt staatiline, vaid v\u00f5ib esitada muutumatute ja kustutamatute plokkidena (kuigi neid v\u00f5ib lisada).<\/p>\n<p><\/p>\n<p>Veel \u00fche n\u00e4iteks (kinnistamiseks): kui olete t\u00f6\u00f6tanud Jenkins'i v\u00f5i TeamCity'ga, siis teate, et m\u00f5lemad lahendused on kirjutatud Java's. Need on Java-protsessid, mis tegelevad nii build'ide orkestreerimise kui ka sisu haldamisega. Konkreetsemalt, m\u00f5lemal on \u00fclesanded, n\u00e4iteks \"edasi anda fail\/kataloog serverist\". N\u00e4iteks: artefaktide v\u00e4ljastamine, l\u00e4htekoodi edastamine (kui agent ei laadi koodi otse hoidlast, vaid teeb seda server), juurdep\u00e4\u00e4s logidele. K\u00f5ik need \u00fclesanded erinevad IO koormusest. Seega selgub, et server, mis vastutab keeruka \u00e4ri loogika eest, peab olema suuteline t\u00f5husalt edastama suuri andmevooge. Ja mis k\u00f5ige huvitavam, sarnase operatsiooni saab delegeerida ka nginx'ile t\u00e4pselt sama skeemi j\u00e4rgi (v\u00e4lja arvatud, et p\u00e4ringule tuleb lisada andmev\u00e4li).<\/p>\n<p><\/p>\n<p>Kuid kui naasta meie s\u00fcsteemi juurde, siis saame sellise skeemi:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Mugavad arhitektuuri 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 ei ole enam lihtsalt mini-protsess, mis salvestab faile kohapeal. N\u00fc\u00fcd on vajalik mitte k\u00f5ige lihtsam tugi, API versioonide kontroll ja nii edasi. Seet\u00f5ttu, p\u00e4rast k\u00f5igi diagrammide joonistamist, on k\u00f5ige parem detailselt hinnata, kas sarnased kulud on \u00f5igustatud. Kui soovite s\u00fcsteemi laienemise v\u00f5imalusi (sealhulgas suurenenud kasutajate arvu toetamiseks), peate kaaluma selliste lahenduste kasutuselev\u00f5ttu. Kuid tulemuseks on see, et arhitektuuriline s\u00fcsteem on valmis koormuse suurendamiseks (peaaegu iga komponent on v\u00f5imalik horisontaalselt kloneerida). S\u00fcsteemi saab uuendada selle peatamata (lihtsalt m\u00f5ned toimingud aeglustuvad veidi).<\/p>\n<p><\/p>\n<p>Nagu ma juba alguses r\u00e4\u00e4kisin, on mitmed internetiteenused hakanud kogema suurenenud koormust. Ja m\u00f5ned neist on lihtsalt l\u00f5petanud korraliku t\u00f6\u00f6. Tegelikult kukkusid s\u00fcsteemid kokku just siis, kui \u00e4ri peaks raha teenima. See t\u00e4hendab, et asemel, et edasi l\u00fckata kohaletoimetamine, ning pakkuda klientidele 'planeerige kohaletoimetamist j\u00e4rgmiste kuude jooksul', \u00fctles s\u00fcsteem lihtsalt 'minge konkurentide juurde'. See ongi madala j\u00f5udluse hind: kaotused ilmnevad just siis, kui kasum oleks k\u00f5rgeim.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Kokkuv\u00f5te<\/h1>\n<p><\/p>\n<p>K\u00f5ik need l\u00e4henemisviisid on olnud juba varem tuntud. N\u00e4iteks VK on juba ammu kasutanud staatilise sisu hostimise ideed piltide jagamiseks. Hulgaliselt veebim\u00e4nge kasutavad fragmentimist (Sharding) m\u00e4ngijate jagamiseks piirkondade vahel v\u00f5i m\u00e4ngukohtade jagamiseks (kui maailm on \u00fchtne). Event sourcing l\u00e4henemist kasutatakse aktiivselt e-posti teenustes. Enamik kauplejate rakendusi, kuhu voolab pidevalt andmeid, p\u00f5hinevad tegelikult CQRS l\u00e4henemisel, et saaks filtreerida saadud andmeid. Ja horisontaalset skaleerimist on juba pikka aega rakendatud paljudes teenustes.<\/p>\n<p><\/p>\n<p>Kuid k\u00f5ige t\u00e4htsam on see, et k\u00f5iki neid mustreid on modernsetes rakendustes v\u00e4ga 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\u00fc\u00fcd kergem, v\u00e4hemalt t\u00e4nu selliste raamatukogude arengule nagu RX. K\u00fcmme aastat tagasi suutis harva \u00fckski veebisait selliseid asju toetada. Event Sourcing'i seadistamine on samuti uskumatult lihtne t\u00e4nu juba olemasolevatele konteineritele koos Apache Kafka'ga. K\u00fcmme aastat tagasi oleks see olnud innovatsioon, n\u00fc\u00fcd on see igap\u00e4evane praktika. Samuti ka staatilise sisu hostimine: mugavamate tehnoloogiate t\u00f5ttu (sealhulgas p\u00f5hjaliku dokumentatsiooni ja suure vastuste baasi olemasolu t\u00f5ttu) on selline l\u00e4henemine muutunud veelgi lihtsamaks.<\/p>\n<p><\/p>\n<p>Kokkuv\u00f5tteks, mitmete \u00fcsna keeruliste arhitektuurimustrite rakendamine on n\u00fc\u00fcd oluliselt lihtsam, mis t\u00e4hendab, et sellele tasub varakult t\u00e4helepanu p\u00f6\u00f6rata. Kui k\u00fcmne aasta vanuses rakenduses loobuti m\u00f5nest \u00fclalkirjeldatud lahendusest k\u00f5rgete rakendamise ja hoolduskulude t\u00f5ttu, siis n\u00fc\u00fcd, uues rakenduses v\u00f5i p\u00e4rast refaktorimist, on v\u00f5imalik luua teenus, mis on arhitektuuriliselt nii skaleeritav (t\u00f5hususe vaatenurgast) kui ka valmis klientide uute n\u00f5udmiste jaoks (n\u00e4iteks isikuandmete lokaliseerimiseks).<\/p>\n<p><\/p>\n<p>Ja k\u00f5ige t\u00e4htsam: palun \u00e4rge kasutage neid l\u00e4henemisviise, kui teil on lihtne rakendus. Jah, need on ilusad ja huvitavad, kuid saidile, mille tippk\u00fclastus on 100 inimest, v\u00f5ib sageli piisata klassikalisest monoliidist (v\u00e4hemalt v\u00e4ljastpoolt, seestpoolt saab k\u00f5ik mooduliteks jagada 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 5.0.1.1 - 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.\" \/>\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) 5.0.1.1\" \/>\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.\" \/>\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! K\u00e4esolevate koroonaviiruse t\u00f5ttu saame teada, et mitmed internetiteenused on hakanud kogema suurenenud koormust.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}