{"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\/sk\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","title":{"rendered":"Pohodln\u00e9 architektonick\u00e9 vzory","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj, Habr!<\/p>\n<p><\/p>\n<p>V s\u00favislosti s aktu\u00e1lnymi udalos\u0165ami sp\u00f4soben\u00fdmi koronav\u00edrusom niektor\u00e9 internetov\u00e9 slu\u017eby zaznamenali zv\u00fd\u0161en\u00e9 za\u0165a\u017eenie. Napr\u00edklad, <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\">jedna z obchodn\u00fdch siet\u00ed vo Ve\u013ekej Brit\u00e1nii jednoducho zastavila svoj web pre online objedn\u00e1vky,<\/a><\/noindex>preto\u017ee nemali dostato\u010dn\u00fa kapacitu. A nie v\u017edy je mo\u017en\u00e9 ur\u00fdchli\u0165 server, jednoducho pridan\u00edm v\u00fdkonnej\u0161ieho hardv\u00e9ru, av\u0161ak po\u017eiadavky z\u00e1kazn\u00edkov je potrebn\u00e9 spracova\u0165 (in\u00e1\u010d od\u00eddu ku konkurencii).<\/p>\n<p><\/p>\n<p>V tomto \u010dl\u00e1nku stru\u010dne pop\u00ed\u0161em popul\u00e1rne praktiky, ktor\u00e9 umo\u017e\u0148uj\u00fa vytvori\u0165 r\u00fdchlu a odoln\u00fa slu\u017ebu. Z dostupn\u00fdch v\u00fdvojov\u00fdch sch\u00e9m som vybral iba tie, ktor\u00fdmi sa teraz <strong>\u013eahko d\u00e1 vyu\u017ei\u0165.<\/strong>Pre ka\u017ed\u00fd bod u\u017e m\u00e1te bu\u010f hotov\u00e9 kni\u017enice, alebo je tu mo\u017enos\u0165 vyrie\u0161i\u0165 \u00falohu pomocou cloudovej platformy.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"gorizontalnoe-masshtabirovanie\">Horizont\u00e1lne \u0161k\u00e1lovanie<\/h1>\n<p><\/p>\n<p>Najjednoduch\u0161\u00ed a v\u0161etk\u00fdm zn\u00e1my bod. Pod\u013ea rozdelenia z\u00e1\u0165a\u017ee sa zvy\u010dajne najviac stret\u00e1va s dvoma sch\u00e9mami - horizont\u00e1lnym a vertik\u00e1lnym \u0161k\u00e1lovan\u00edm. <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\">V prvom pr\u00edpade<\/a><\/noindex> umo\u017e\u0148ujete slu\u017eb\u00e1m pracova\u0165 paralelne, \u010d\u00edm rozde\u013eujete z\u00e1\u0165a\u017e medzi nimi. <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\">V druhom<\/a><\/noindex> objedn\u00e1vate v\u00fdkonnej\u0161ie servery alebo optimalizujete k\u00f3d.<\/p>\n<p><\/p>\n<p>Pre pr\u00edklad beriem abstraktn\u00e9 cloudov\u00e9 \u00falo\u017eisko s\u00faborov, teda nie\u010do ako OwnCloud, OneDrive a tak \u010falej.<\/p>\n<p><\/p>\n<p>\u0160tandardn\u00fd obr\u00e1zok takejto sch\u00e9my je ni\u017e\u0161ie, av\u0161ak iba demon\u0161truje zlo\u017eitosti syst\u00e9mu. Ve\u010f potrebujeme nejak\u00fdm sp\u00f4sobom synchronizova\u0165 slu\u017eby. \u010co sa stane, ak pou\u017e\u00edvate\u013e ulo\u017e\u00ed s\u00fabor na tablete a potom chce na\u0148 pozrie\u0165 z telef\u00f3nu?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/7512c6d8783f5e0a38cc0861b01e54c8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRozdiel medzi pr\u00edstupmi: pri vertik\u00e1lnom \u0161k\u00e1lovan\u00ed sme ochotn\u00ed zvy\u0161ova\u0165 v\u00fdkon uzlov, zatia\u013e \u010do pri horizont\u00e1lnom - prid\u00e1va\u0165 nov\u00e9 uzly, aby sme rozlo\u017eili z\u00e1\u0165a\u017e.<\/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\">Rozdelenie zodpovednosti pr\u00edkazov a dotazov<\/a><\/noindex> je dos\u0165 d\u00f4le\u017eit\u00fd vzor, preto\u017ee umo\u017e\u0148uje r\u00f4znym klientom nielen sa pripoji\u0165 k r\u00f4znym slu\u017eb\u00e1m, ale aj z\u00edskava\u0165 rovnak\u00e9 toky udalost\u00ed. Jeho v\u00fdhody nie s\u00fa tak\u00e9 o\u010dividn\u00e9 pre jednoduch\u00fa aplik\u00e1ciu, av\u0161ak je extr\u00e9mne d\u00f4le\u017eit\u00fd (a jednoduch\u00fd) pre za\u0165a\u017een\u00e9 slu\u017eby. Jeho podstata: prich\u00e1dzaj\u00face a odch\u00e1dzaj\u00face toky \u00fadajov by sa nemali prekr\u00fdva\u0165. To znamen\u00e1, \u017ee nem\u00f4\u017eete posla\u0165 po\u017eiadavku a \u010daka\u0165 na odpove\u010f, namiesto toho posielate po\u017eiadavku do slu\u017eby A, av\u0161ak odpove\u010f dostanete zo slu\u017eby B.<\/p>\n<p><\/p>\n<p>Prv\u00e1 v\u00fdhoda tohto pr\u00edstupu \u2014 mo\u017enos\u0165 preru\u0161i\u0165 spojenie (v \u0161irokom zmysle tohto slova) po\u010das vykon\u00e1vania dlh\u00e9ho po\u017eiadavku. Ako pr\u00edklad si berieme viac-menej \u0161tandardn\u00fa sekvenciu:<\/p>\n<p><\/p>\n<ol>\n<li>Klient odoslal po\u017eiadavku na server.<\/li>\n<li>Server spustil dlh\u00e9 spracovanie.<\/li>\n<li>Server odpovedal klientovi v\u00fdsledkom.<\/li>\n<\/ol>\n<p><\/p>\n<p>Predstavme si, \u017ee v bode 2 do\u0161lo k preru\u0161eniu spojenia (alebo sa sie\u0165 preru\u0161ila, alebo pou\u017e\u00edvate\u013e pre\u0161iel na in\u00fa str\u00e1nku, \u010d\u00edm preru\u0161il spojenie). V takom pr\u00edpade bude serveru \u0165a\u017ek\u00e9 posla\u0165 odpove\u010f pou\u017e\u00edvate\u013eovi s inform\u00e1ciou, \u010do presne bolo spracovan\u00e9. Pou\u017eit\u00edm CQRS bude sekvencia trochu in\u00e1:<\/p>\n<p><\/p>\n<ol>\n<li>Klient sa prihl\u00e1sil na aktualiz\u00e1cie.<\/li>\n<li>Klient odoslal po\u017eiadavku na server.<\/li>\n<li>Server odpovedal \u201epo\u017eiadavka prijat\u00e1\u201c.<\/li>\n<li>Server odpovedal v\u00fdsledkom cez kan\u00e1l z bodu \u201e1\u201c.<\/li>\n<\/ol>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/8a00ea93eecc7cc0754122857c5f90d0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ako je vidie\u0165, sch\u00e9ma je o nie\u010do zlo\u017eitej\u0161ia. Navy\u0161e intuit\u00edvny pr\u00edstup request-response tu ch\u00fdba. Ako je v\u0161ak vidie\u0165, preru\u0161enie spojenia po\u010das spracovania po\u017eiadavky nesp\u00f4sob\u00ed chybu. Navy\u0161e, ak je pou\u017e\u00edvate\u013e naozaj pripojen\u00fd k slu\u017ebe z viacer\u00fdch zariaden\u00ed (napr\u00edklad z mobiln\u00e9ho telef\u00f3nu a z tabletu), m\u00f4\u017eeme zabezpe\u010di\u0165, aby odpove\u010f pri\u0161la na obe zariadenia.<\/p>\n<p><\/p>\n<p>Zauj\u00edmav\u00e9 je, \u017ee k\u00f3d spracovania prich\u00e1dzaj\u00facich spr\u00e1v sa st\u00e1va rovnak\u00fdm (nie na 100%) pre udalosti, na ktor\u00e9 mal vplyv s\u00e1m klient, ako aj pre ostatn\u00e9 udalosti, vr\u00e1tane t\u00fdch od in\u00fdch klientov.<\/p>\n<p><\/p>\n<p>V skuto\u010dnosti v\u0161ak z\u00edskavame \u010fal\u0161ie v\u00fdhody, preto\u017ee jednosmern\u00fd tok je mo\u017en\u00e9 spracov\u00e1va\u0165 vo funkcion\u00e1lnom \u0161t\u00fdle (pou\u017e\u00edvaj\u00fac RX a anal\u00f3gy). A to je u\u017e zna\u010dn\u00e1 v\u00fdhoda, preto\u017ee aplik\u00e1ciu je mo\u017en\u00e9 \u00faplne urobi\u0165 reakt\u00edvnou, pri\u010dom sa pou\u017e\u00edva funkcion\u00e1lny pr\u00edstup. Pre rozsiahle programy to m\u00f4\u017ee v\u00fdrazne u\u0161etri\u0165 zdroje pri v\u00fdvoji a podpore.<\/p>\n<p><\/p>\n<p>Ak spoj\u00edme tento pr\u00edstup s horizont\u00e1lnym \u0161k\u00e1lovan\u00edm, dost\u00e1vame bonus v podobe schopnosti posiela\u0165 po\u017eiadavky na jeden server a prij\u00edma\u0165 odpovede od in\u00e9ho. Tak\u00fdmto sp\u00f4sobom si klient m\u00f4\u017ee s\u00e1m vybra\u0165 pohodln\u00fa slu\u017ebu, zatia\u013e \u010do syst\u00e9m vo vn\u00fatri bude st\u00e1le schopn\u00fd spr\u00e1vne spracova\u0165 udalosti.<\/p>\n<p><\/p>\n<h1 id=\"event-sourcing\">Event Sourcing<\/h1>\n<p><\/p>\n<p>Ako v\u0161etci viete, jednou z hlavn\u00fdch vlastnost\u00ed distribuovan\u00e9ho syst\u00e9mu je absencia spolo\u010dn\u00e9ho \u010dasu a spolo\u010dnej kritickej sekcie. Pre jeden proces m\u00f4\u017eete urobi\u0165 synchroniz\u00e1ciu (na t\u00fdch ist\u00fdch mutexoch), po\u010das ktorej si m\u00f4\u017eete by\u0165 ist\u00ed, \u017ee nikto in\u00fd tento k\u00f3d nevykon\u00e1va. Av\u0161ak pre distribuovan\u00fd syst\u00e9m je to nebezpe\u010dn\u00e9, preto\u017ee to vy\u017eaduje n\u00e1klady a zni\u010d\u00ed to v\u0161etku kr\u00e1su \u0161k\u00e1lovania - aj tak v\u0161etky komponenty bud\u00fa \u010daka\u0165 na jednu vec.<\/p>\n<p><\/p>\n<p>Odtia\u013e dost\u00e1vame d\u00f4le\u017eit\u00fd fakt - r\u00fdchlu distribuovan\u00fa syst\u00e9m nie je mo\u017en\u00e9 synchronizova\u0165, lebo v opa\u010dnom pr\u00edpade zn\u00ed\u017eime v\u00fdkon. Na druhej strane, \u010dasto potrebujeme ur\u010dit\u00fa konzistenciu komponentov. A na to m\u00f4\u017eeme pou\u017ei\u0165 pr\u00edstup s <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">eventu\u00e1lnou konzistenciou<\/a><\/noindex>, kde sa zaru\u010duje, \u017ee pri absencii zmien \u00fadajov po ur\u010ditom \u010dasovom intervale od poslednej aktualiz\u00e1cie (\"na konci\") v\u0161etky \u017eiadosti vr\u00e1tia posledn\u00fa aktualizovan\u00fa hodnotu.<\/p>\n<p><\/p>\n<p>Je d\u00f4le\u017eit\u00e9 ch\u00e1pa\u0165, \u017ee pre klasick\u00e9 datab\u00e1zy sa pomerne \u010dasto pou\u017e\u00edva <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Consistency_model#Strict_consistency\">pr\u00edsna konzistencia<\/a><\/noindex>, kde ka\u017ed\u00fd uzol vlastn\u00ed rovnak\u00e9 inform\u00e1cie (to sa \u010dasto dosahuje, ke\u010f sa transakcia pova\u017euje za potvrden\u00fa a\u017e po odpovedi druh\u00e9ho servera). Tu existuj\u00fa niektor\u00e9 \u00fa\u013eavy v\u010faka \u00farovniam izol\u00e1cie, av\u0161ak celkov\u00fd princ\u00edp zost\u00e1va rovnak\u00fd - m\u00f4\u017eete \u017ei\u0165 v \u00faplne konzistentnom svete.<\/p>\n<p><\/p>\n<p>Av\u0161ak vr\u00e1\u0165me sa k po\u010diato\u010dnej \u00falohe. Ak m\u00f4\u017ee by\u0165 \u010das\u0165 syst\u00e9mu postaven\u00e1 s <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Eventual_consistency\">eventu\u00e1lnou konzistenciou<\/a><\/noindex>, m\u00f4\u017eeme postavi\u0165 nasleduj\u00facu sch\u00e9mu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/33c80be6bc33bd897ca9b9e5525f9ae8.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>D\u00f4le\u017eit\u00e9 vlastnosti tohto pr\u00edstupu:<\/p>\n<p><\/p>\n<ul>\n<li>Ka\u017ed\u00e1 prich\u00e1dzaj\u00faca \u017eiados\u0165 je umiestnen\u00e1 do jednej fronty.<\/li>\n<li>Po\u010das spracovania \u017eiadosti m\u00f4\u017ee slu\u017eba tie\u017e umiestni\u0165 \u00falohy do in\u00fdch front.<\/li>\n<li>Ka\u017ed\u00e1 prich\u00e1dzaj\u00faca udalos\u0165 m\u00e1 identifik\u00e1tor (ktor\u00fd je potrebn\u00fd na deduplik\u00e1ciu).<\/li>\n<li>Fronta funguje ideologicky na princ\u00edpe \u201eappend only\u201c. Z nej nie je mo\u017en\u00e9 odstra\u0148ova\u0165 prvky ani ich pres\u00fava\u0165.<\/li>\n<li>Fronta pracuje na princ\u00edpe FIFO (ospravedl\u0148ujem sa za tautol\u00f3giu). Ak je potrebn\u00e9 vykon\u00e1va\u0165 paralelne, mali by ste v jednom z krokov presun\u00fa\u0165 objekty do r\u00f4znych front.<\/li>\n<\/ul>\n<p><\/p>\n<p>Pripom\u00ednam, \u017ee sa zaober\u00e1me pr\u00edpadom online \u00falo\u017eiska s\u00faborov. V tomto pr\u00edpade syst\u00e9m bude vyzera\u0165 pribli\u017ene takto:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/b95efb29545dcde1db9432d12d00a1b1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Je d\u00f4le\u017eit\u00e9, \u017ee slu\u017eby na diagrame neznamenaj\u00fa nutne samostatn\u00fd server. Aj proces m\u00f4\u017ee by\u0165 rovnak\u00fd. D\u00f4le\u017eit\u00e9 je, \u017ee ideologicky s\u00fa tieto veci rozdelen\u00e9 tak, aby bolo mo\u017en\u00e9 jednoducho aplikova\u0165 horizont\u00e1lne \u0161k\u00e1lovanie.<\/p>\n<p><\/p>\n<p>Pre dvoch pou\u017e\u00edvate\u013eov bude sch\u00e9ma vyzera\u0165 takto (slu\u017eby ur\u010den\u00e9 r\u00f4znym pou\u017e\u00edvate\u013eom s\u00fa ozna\u010den\u00e9 r\u00f4znymi farbami):<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/4c4aadc8b9dd505c3ad743e69fee4fae.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>V\u00fdhody podobnej kombin\u00e1cie:<\/p>\n<p><\/p>\n<ul>\n<li>Slu\u017eby spracovania inform\u00e1ci\u00ed s\u00fa rozdelen\u00e9. Rovnako s\u00fa rozdelen\u00e9 aj fronty. Ak potrebujeme zv\u00fd\u0161i\u0165 priepustnos\u0165 syst\u00e9mu, sta\u010d\u00ed len spusti\u0165 viac slu\u017eieb na v\u00e4\u010d\u0161om po\u010dte serverov.<\/li>\n<li>Ke\u010f dost\u00e1vame inform\u00e1cie od pou\u017e\u00edvate\u013ea, nemus\u00edme \u010daka\u0165 na \u00fapln\u00e9 ulo\u017eenie d\u00e1t. Naopak, sta\u010d\u00ed odpoveda\u0165 \u201eok\u201c a potom postupne za\u010da\u0165 pr\u00e1cu. Fronta taktie\u017e vyhladzuje \u0161pi\u010dky, preto\u017ee pridanie nov\u00e9ho objektu prebieha r\u00fdchlo a pou\u017e\u00edvate\u013e nemus\u00ed \u010daka\u0165 na kompletn\u00e9 prech\u00e1dzanie cel\u00fdm cyklom.<\/li>\n<li>Pre pr\u00edklad som pridal slu\u017ebu deduplik\u00e1cie, ktor\u00e1 sa sna\u017e\u00ed spoji\u0165 rovnak\u00e9 s\u00fabory. Ak dlho pracuje na 1 % pr\u00edpadoch, klient to takmer nezbad\u00e1 (vi\u010f vy\u0161\u0161ie), \u010do je ve\u013ek\u00e9 plus, preto\u017ee od n\u00e1s u\u017e nie je potrebn\u00e1 stopercentn\u00e1 r\u00fdchlos\u0165 a spo\u013eahlivos\u0165.<\/li>\n<\/ul>\n<p><\/p>\n<p>Av\u0161ak okam\u017eite s\u00fa vidite\u013en\u00e9 aj nedostatky:<\/p>\n<p><\/p>\n<ul>\n<li>Na\u0161a s\u00fastava stratila pr\u00edsnu konzistenciu. To znamen\u00e1, \u017ee ak sa napr\u00edklad prihl\u00e1site na r\u00f4zne slu\u017eby, teoreticky m\u00f4\u017eete z\u00edska\u0165 r\u00f4zny stav (preto\u017ee jedna zo slu\u017eieb m\u00f4\u017ee nestihn\u00fa\u0165 prija\u0165 ozn\u00e1menie z vn\u00fatornej fronty). Ako \u010fal\u0161\u00ed d\u00f4sledok, syst\u00e9m teraz nem\u00e1 spolo\u010dn\u00fd \u010das. To znamen\u00e1, \u017ee napr\u00edklad nemo\u017eno triedi\u0165 v\u0161etky udalosti jednoducho pod\u013ea \u010dasu pr\u00edchodu, preto\u017ee hodiny medzi servermi m\u00f4\u017eu by\u0165 nesynchronized (viac ne\u017e to, ma\u0165 rovnak\u00fd \u010das na dvoch serveroch je ut\u00f3pia).<\/li>\n<li>\u017diadne udalosti nemo\u017eno teraz jednoducho vr\u00e1ti\u0165 (ako by sa to dalo urobi\u0165 s datab\u00e1zou). Namiesto toho je potrebn\u00e9 prida\u0165 nov\u00fa udalos\u0165 \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49451237\/compensating-events-on-cqrs-es-architecture\">compensation event<\/a><\/noindex>, ktor\u00e1 zmen\u00ed posledn\u00fd stav na po\u017eadovan\u00fd. Ako pr\u00edklad z podobnej oblasti: bez prepisovania hist\u00f3rie (\u010do je zle v niektor\u00fdch pr\u00edpadoch) v gite nie je mo\u017en\u00e9 vr\u00e1ti\u0165 commit, ale m\u00f4\u017eete vytvori\u0165 \u0161peci\u00e1lny <noindex><a rel=\"nofollow\" href=\"https:\/\/git-scm.com\/docs\/git-revert\">rollback commit<\/a><\/noindex>, ktor\u00fd v podstate len vr\u00e1ti star\u00fd stav. Av\u0161ak v hist\u00f3rii zostane aj chybn\u00fd commit a rollback.<\/li>\n<li>Sch\u00e9ma d\u00e1t sa m\u00f4\u017ee meni\u0165 od vydania k vydaniu, av\u0161ak star\u00e9 udalosti u\u017e nebude mo\u017en\u00e9 aktualizova\u0165 na nov\u00fd \u0161tandard (preto\u017ee udalosti sa v z\u00e1sade nedaj\u00fa meni\u0165).<\/li>\n<\/ul>\n<p><\/p>\n<p>Ako je vidie\u0165, Event Sourcing sa skvele kombinuje s CQRS. Navy\u0161e, realiz\u00e1cia syst\u00e9mu s efekt\u00edvnymi a pohodln\u00fdmi frontami, ale bez rozdelenia d\u00e1tov\u00fdch tokov, je sama osebe n\u00e1ro\u010dn\u00e1, preto\u017ee bude potrebn\u00e9 prida\u0165 body synchroniz\u00e1cie, ktor\u00e9 vyrovnaj\u00fa v\u0161etky pozit\u00edvne efekty z front. Pou\u017eit\u00edm oboch pr\u00edstupov naraz je nevyhnutn\u00e9 mierne upravi\u0165 k\u00f3d fungovania programu. V na\u0161om pr\u00edpade, pri odosielan\u00ed s\u00faboru na server, v odpovedi prich\u00e1dza len \u201eok\u201c, \u010do znamen\u00e1 len to, \u017ee \u201eoper\u00e1cia pridania s\u00faboru bola ulo\u017een\u00e1\u201c. Form\u00e1lne to neznamen\u00e1, \u017ee d\u00e1ta s\u00fa u\u017e dostupn\u00e9 na in\u00fdch zariadeniach (napr\u00edklad slu\u017eba deduplik\u00e1cie m\u00f4\u017ee prestavova\u0165 index). Av\u0161ak po ur\u010ditom \u010dase klientovi pr\u00edde upozornenie v \u0161t\u00fdle \u201es\u00fabor X bol ulo\u017een\u00fd.\u201c<\/p>\n<p><\/p>\n<p>Ako v\u00fdsledok:<\/p>\n<p><\/p>\n<ul>\n<li>Po\u010det stavov odosielania s\u00faborov sa zvy\u0161uje: namiesto klasick\u00e9ho \u201es\u00fabor bol odoslan\u00fd\u201c z\u00edskavame dva: \u201es\u00fabor bol pridan\u00fd do fronty na serveri\u201c a \u201es\u00fabor bol ulo\u017een\u00fd v \u00falo\u017eisku\u201c. To posledn\u00e9 znamen\u00e1, \u017ee in\u00e9 zariadenia m\u00f4\u017eu za\u010da\u0165 dost\u00e1va\u0165 s\u00fabor (s oh\u013eadom na to, \u017ee fronty funguj\u00fa r\u00f4znou r\u00fdchlos\u0165ou).<\/li>\n<li>Preto\u017ee inform\u00e1cie o odoslan\u00ed teraz prich\u00e1dzaj\u00fa r\u00f4znymi kan\u00e1lmi, potrebujeme vymyslie\u0165 rie\u0161enia, aby sme z\u00edskali stav spracovania s\u00faboru. Z toho vypl\u00fdva: na rozdiel od klasick\u00e9ho request-response m\u00f4\u017ee by\u0165 klient re\u0161tartovan\u00fd po\u010das spracovania s\u00faboru, av\u0161ak stav tohto spracovania bude spr\u00e1vny. Tento bod funguje v podstate z krabice. Ako v\u00fdsledok: sme teraz tolerantnej\u0161\u00ed vo\u010di zlyhaniam.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sharding\">Sharding<\/h1>\n<p><\/p>\n<p>Ako bolo u\u017e vy\u0161\u0161ie pop\u00edsan\u00e9, v syst\u00e9moch s event sourcingom neexistuje pr\u00edsna konzistencia. To znamen\u00e1, \u017ee m\u00f4\u017eeme pou\u017e\u00edva\u0165 viacero \u00falo\u017e\u00edsk bez akejko\u013evek synchroniz\u00e1cie medzi nimi. Pribli\u017euj\u00fac sa k na\u0161ej \u00falohe, m\u00f4\u017eeme:<\/p>\n<p><\/p>\n<ul>\n<li>Rozde\u013eova\u0165 s\u00fabory pod\u013ea typov. Napr\u00edklad, obr\u00e1zky\/videa m\u00f4\u017eeme dek\u00f3dova\u0165 a vybra\u0165 efekt\u00edvnej\u0161\u00ed form\u00e1t.<\/li>\n<li>Rozde\u013eovanie \u00fa\u010dtov pod\u013ea kraj\u00edn. Kv\u00f4li r\u00f4znym z\u00e1konom m\u00f4\u017ee by\u0165 tak\u00e1to mo\u017enos\u0165 potrebn\u00e1, ale t\u00e1to architekt\u00fara to umo\u017e\u0148uje automaticky.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/dd310df700bc39c014d0105a3425fece.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ak chcete prenies\u0165 \u00fadaje z jedn\u00e9ho \u00falo\u017eiska do druh\u00e9ho, u\u017e sa neobi\u0161lo bez \u0161tandardn\u00fdch prostriedkov. Bohu\u017eia\u013e, v takom pr\u00edpade je potrebn\u00e9 zastavi\u0165 frontu, vykona\u0165 migr\u00e1ciu a n\u00e1sledne ju spusti\u0165. Vo v\u0161eobecnosti nie je mo\u017en\u00e9 prenies\u0165 \u00fadaje 'za behu', av\u0161ak, ak je fronta udalost\u00ed plne ulo\u017een\u00e1 a m\u00e1te k\u00f3pie predch\u00e1dzaj\u00facich stavov \u00falo\u017eiska, m\u00f4\u017eeme udalosti prehr\u00e1\u0165 nasleduj\u00facim sp\u00f4sobom:<\/p>\n<p><\/p>\n<ul>\n<li>V Event Source m\u00e1 ka\u017ed\u00e1 udalos\u0165 svoj identifik\u00e1tor (ide\u00e1lne - neklesaj\u00faci). To znamen\u00e1, \u017ee do \u00falo\u017eiska m\u00f4\u017eeme prida\u0165 pole - id posledn\u00e9ho spracovan\u00e9ho prvku.<\/li>\n<li>Duplikujeme frontu, aby v\u0161etky udalosti mohli by\u0165 spracov\u00e1van\u00e9 pre nieko\u013eko nez\u00e1visl\u00fdch \u00falo\u017e\u00edsk (prv\u00e9 je to, v ktorom s\u00fa u\u017e teraz ulo\u017een\u00ed \u00fadaje, a druh\u00e9 je nov\u00e9, av\u0161ak zatia\u013e pr\u00e1zdne). Druh\u00e1 fronta sa, samozrejme, zatia\u013e nespracov\u00e1va.<\/li>\n<li>Sp\u00fa\u0161\u0165ame druh\u00fa frontu (t.j. za\u010d\u00edname prehr\u00e1vanie udalost\u00ed).<\/li>\n<li>Ke\u010f bude nov\u00e1 fronta relat\u00edvne pr\u00e1zdna (t.j. priemern\u00fd \u010dasov\u00fd rozdiel medzi prid\u00e1van\u00edm prvku a jeho vyzdvihnut\u00edm bude prijate\u013en\u00fd), m\u00f4\u017eeme za\u010da\u0165 prepn\u00fa\u0165 \u010ditate\u013eov na nov\u00e9 \u00falo\u017eisko.<\/li>\n<\/ul>\n<p><\/p>\n<p>Ako vid\u00edme, v na\u0161ej s\u00fastave nikdy nebola, ani nie je pr\u00edsna konzistentnos\u0165. Existuje len eventual consistency, \u010do znamen\u00e1 z\u00e1ruku, \u017ee udalosti s\u00fa spracov\u00e1van\u00e9 v rovnakom porad\u00ed (av\u0161ak, mo\u017en\u00e9 s r\u00f4znymi oneskoreniami). A vyu\u017eit\u00edm tohto m\u00f4\u017eeme relat\u00edvne jednoducho prenies\u0165 \u00fadaje bez zastavenia syst\u00e9mu na druh\u00fd koniec sveta.<\/p>\n<p><\/p>\n<p>Takto, pokra\u010duj\u00fac v na\u0161om pr\u00edklade online \u00falo\u017eiska pre s\u00fabory, n\u00e1m tak\u00e1to architekt\u00fara u\u017e poskytuje nieko\u013eko bonusov:<\/p>\n<p><\/p>\n<ul>\n<li>M\u00f4\u017eeme presun\u00fa\u0165 objekty bli\u017e\u0161ie k pou\u017e\u00edvate\u013eom, a to dynamicky. Takto m\u00f4\u017eeme zlep\u0161i\u0165 kvalitu slu\u017eby. <\/li>\n<li>M\u00f4\u017eeme uchov\u00e1va\u0165 \u010das\u0165 \u00fadajov vo vn\u00fatri firiem. Napr\u00edklad, Enterprise pou\u017e\u00edvatelia \u010dasto po\u017eaduj\u00fa uchov\u00e1va\u0165 svoje \u00fadaje v pod kontrolou d\u00e1tov\u00fdch centier (aby sa predi\u0161lo \u00fanikom \u00fadajov). V\u010faka sharding m\u00f4\u017eeme to \u013eahko podpori\u0165. A \u00faloha je e\u0161te jednoduch\u0161ia, ak m\u00e1 z\u00e1kazn\u00edk kompatibiln\u00e9 cloud (napr\u00edklad, <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>A najd\u00f4le\u017eitej\u0161ie je, \u017ee to nemus\u00edme robi\u0165. Predsa by n\u00e1m na za\u010diatok sta\u010dila jedna \u00falo\u017eisko pre v\u0161etky \u00fa\u010dty (aby sme mohli r\u00fdchlo za\u010da\u0165 pracova\u0165). A k\u013e\u00fa\u010dovou vlastnos\u0165ou tohto syst\u00e9mu je, \u017ee aj ke\u010f je roz\u0161\u00edrite\u013en\u00fd, v po\u010diato\u010dnej f\u00e1ze je dos\u0165 jednoduch\u00fd. Sta\u010d\u00ed, ak na za\u010diatok nenap\u00ed\u0161eme k\u00f3d pracuj\u00faci s mili\u00f3nom samostatn\u00fdch nez\u00e1visl\u00fdch frontov a podobne. Ak bude potrebn\u00e9, m\u00f4\u017eeme to urobi\u0165 v bud\u00facnosti.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"static-content-hosting\">Hosting statick\u00e9ho obsahu<\/h1>\n<p><\/p>\n<p>Tento bod sa m\u00f4\u017ee zda\u0165 celkom zrejm\u00fd, ale je aj tak nevyhnutn\u00fd pre viac-menej \u0161tandardn\u00fa vy\u0165a\u017eovan\u00fa aplik\u00e1ciu. Jeho podstata je jednoduch\u00e1: cel\u00fd statick\u00fd obsah sa nepon\u00faka z toho ist\u00e9ho servera, kde sa nach\u00e1dza aplik\u00e1cia, ale zo \u0161peci\u00e1lnych, vyhraden\u00fdch na tento \u00fa\u010del. V d\u00f4sledku toho s\u00fa tieto oper\u00e1cie vykon\u00e1van\u00e9 r\u00fdchlej\u0161ie (podmiene\u010dn\u00fd nginx odovzd\u00e1va s\u00fabory r\u00fdchlej\u0161ie a menej n\u00e1kladne ako Java server). Plus architekt\u00fara CDN (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Content_delivery_network\">Content Delivery Network<\/a><\/noindex>) umo\u017e\u0148uje umiestni\u0165 na\u0161e s\u00fabory bli\u017e\u0161ie k koncov\u00fdm pou\u017e\u00edvate\u013eom, \u010do pozit\u00edvne ovplyv\u0148uje pohodlie pri pou\u017e\u00edvan\u00ed slu\u017eby.<\/p>\n<p><\/p>\n<p>Najjednoduch\u0161\u00edm a \u0161tandardn\u00fdm pr\u00edkladom statick\u00e9ho obsahu je s\u00fabor skriptov a obr\u00e1zkov pre web. S nimi je to jednoduch\u00e9 \u2013 s\u00fa zn\u00e1me vopred, n\u00e1sledne sa arch\u00edv nahr\u00e1va na servery CDN, odkia\u013e s\u00fa distribuovan\u00e9 koncov\u00fdm pou\u017e\u00edvate\u013eom.<\/p>\n<p><\/p>\n<p>Av\u0161ak v praxi mo\u017eno na statick\u00fd obsah aplikova\u0165 pr\u00edstup podobn\u00fd lambda architekt\u00fare. Vr\u00e1\u0165me sa k na\u0161ej \u00falohe (online \u00falo\u017eisko s\u00faborov), v ktorej je na\u0161ou \u00falohou distribuova\u0165 s\u00fabory pou\u017e\u00edvate\u013eom. Najjednoduch\u0161ie priamo\u010diare rie\u0161enie \u2013 vytvori\u0165 slu\u017ebu, ktor\u00e1 pre ka\u017ed\u00fd po\u017eiadavok pou\u017e\u00edvate\u013ea vykon\u00e1 v\u0161etky potrebn\u00e9 kontroly (autoriz\u00e1cia a pod.) a potom stiahne s\u00fabor priamo z n\u00e1\u0161ho \u00falo\u017eiska. Hlavnou nev\u00fdhodou tak\u00e9hoto pr\u00edstupu je, \u017ee statick\u00fd obsah (s\u00fabor s konkr\u00e9tnou rev\u00edziou je v z\u00e1sade statick\u00fd obsah) sa distribuuje z toho ist\u00e9ho servera, ktor\u00fd obsahuje biznis logiku. Namiesto toho m\u00f4\u017eeme urobi\u0165 nasleduj\u00facu sch\u00e9mu:<\/p>\n<p><\/p>\n<ul>\n<li>Server vyd\u00e1va URL na stiahnutie. M\u00f4\u017ee ma\u0165 form\u00e1t file_id + key, kde key je mini-digit\u00e1lny podpis, ktor\u00fd d\u00e1va pr\u00e1vo na pr\u00edstup k zdroju na najbli\u017e\u0161\u00ed de\u0148.<\/li>\n<li>Distrib\u00faciou s\u00faboru sa zaober\u00e1 jednoduch\u00fd nginx s nasleduj\u00facimi mo\u017enos\u0165ami:\n<ul>\n<li>Caching of content. Since this service may be on a separate server, we have left ourselves with a margin for the future to store all the latest downloaded files on the disk.<\/li>\n<li>Key verification at the moment of connection establishment<\/li>\n<\/ul>\n<\/li>\n<li>Optionally: streaming content processing. For example, if we compress all the files in the service, we can unzip them directly in this module. As a result, IO operations are done where they belong. The Java archiver can easily allocate a lot of unnecessary memory, but rewriting the service with business logic in conditional Rust\/C++ can also turn out to be inefficient. In our case, different processes (or even services) are used, allowing us to effectively separate business logic and IO operations.<\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/4dead07d5824938e09b986192ccc8f5e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Such a scheme does not resemble serving static content very much (since we are not offloading the entire static package anywhere), but in reality this approach is indeed concerned with distributing immutable data. Moreover, this scheme can be generalized to other cases where content is not just static, but can be represented as a set of immutable and non-removable blocks (though they can be added).<\/p>\n<p><\/p>\n<p>Ako \u010fal\u0161\u00ed pr\u00edklad (pre upevnenie): ak ste pracovali s Jenkinsom\/TeamCity, viete, \u017ee obidve rie\u0161enia s\u00fa nap\u00edsan\u00e9 v Jave. Obidve predstavuj\u00fa proces na b\u00e1ze Javy, ktor\u00fd sa zaober\u00e1 nielen orchestr\u00e1ciou buildov, ale aj spr\u00e1vou obsahu. Konkr\u00e9tne, obidve maj\u00fa \u00falohy typu \u201eprenies\u0165 s\u00fabor\/zlo\u017eku zo servera\u201c. Napr\u00edklad: vydanie artefaktov, prenos zdrojov\u00e9ho k\u00f3du (ke\u010f agent nes\u0165ahuje k\u00f3d priamo z repozit\u00e1ra, ale server to rob\u00ed za neho), pr\u00edstup k logom. V\u0161etky tieto \u00falohy sa l\u00ed\u0161ia z\u00e1\u0165a\u017eou na IO. To znamen\u00e1, \u017ee server, ktor\u00fd zodpoved\u00e1 za zlo\u017eit\u00fa biznis logiku, mus\u00ed z\u00e1rove\u0148 efekt\u00edvne spracov\u00e1va\u0165 ve\u013ek\u00e9 pr\u00fady d\u00e1t. A \u010do je najzauj\u00edmavej\u0161ie, tak\u00fato oper\u00e1ciu m\u00f4\u017eete delegova\u0165 aj na nginx presne pod\u013ea tej istej sch\u00e9my (len do po\u017eiadavky treba prida\u0165 k\u013e\u00fa\u010d d\u00e1t).<\/p>\n<p><\/p>\n<p>However, if we return to our system, we get a scheme like this:<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Pohodln\u00e9 architektonick\u00e9 vzory\" src=\"\/wp-content\/uploads\/2020\/05\/97cfbf5daaa6678a9eecc3169692f0fc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ako je vidno, syst\u00e9m sa radik\u00e1lne skomplikoval. Teraz to nie je len mini-proces, ktor\u00fd uklad\u00e1 s\u00fabory lok\u00e1lne. Teraz je potrebn\u00e1 u\u017e nie najjednoduch\u0161ia podpora, kontrola verzi\u00ed API at\u010f. Preto po vykreslen\u00ed v\u0161etk\u00fdch diagramov je najlep\u0161ie podrobne zhodnoti\u0165, \u010di stoj\u00ed za to roz\u0161irovanie tak\u00fdchto n\u00e1kladov. Ak v\u0161ak chcete ma\u0165 schopnos\u0165 roz\u0161irova\u0165 syst\u00e9m (vr\u00e1tane pr\u00e1ce s e\u0161te v\u00e4\u010d\u0161\u00edm po\u010dtom pou\u017e\u00edvate\u013eov), budete musie\u0165 prist\u00fapi\u0165 k tak\u00fdmto rie\u0161eniam. Na druhej strane v\u0161ak, ako v\u00fdsledok, je syst\u00e9m architektonicky pripraven\u00fd na zv\u00fd\u0161enie za\u0165a\u017eenia (prakticky ka\u017ed\u00fd komponent sa d\u00e1 klonova\u0165 na horizont\u00e1lne \u0161k\u00e1lovanie). Syst\u00e9m m\u00f4\u017eete aktualizova\u0165 bez jeho zastavenia (ur\u010dit\u00e9 oper\u00e1cie sa jednoducho mierne spomalia).<\/p>\n<p><\/p>\n<p>Ako som u\u017e hovoril na za\u010diatku, teraz sa rad online slu\u017eieb dost\u00e1va pod zv\u00fd\u0161en\u00e9 za\u0165a\u017eenie. A niektor\u00e9 z nich jednoducho prestali spr\u00e1vne fungova\u0165. V podstate syst\u00e9my zlyhali pr\u00e1ve v okamihu, ke\u010f by mal biznis zar\u00e1ba\u0165 peniaze. Teda namiesto odlo\u017eenej dod\u00e1vky, namiesto ponuky z\u00e1kazn\u00edkom \u201enapl\u00e1nujte dod\u00e1vku na najbli\u017e\u0161ie mesiace\u201c, syst\u00e9m jednoducho povedal \u201echo\u010fte k konkurentom\u201c. To je cena n\u00edzkej v\u00fdkonnosti: straty nastan\u00fa pr\u00e1ve vtedy, ke\u010f by bol zisk najvy\u0161\u0161\u00ed.<\/p>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Z\u00e1ver<\/h1>\n<p><\/p>\n<p>V\u0161etky tieto pr\u00edstupy boli zn\u00e1me u\u017e predt\u00fdm. Ten ist\u00fd VK d\u00e1vno u\u017e vyu\u017e\u00edva my\u0161lienku Static Content Hosting na vyd\u00e1vanie obr\u00e1zkov. Hromada online hier pou\u017e\u00edva sch\u00e9mu Sharding na rozdelenie hr\u00e1\u010dov pod\u013ea regi\u00f3nov alebo na rozdelenie hern\u00fdch lokal\u00edt (ak je svet jednotn\u00fd). Pr\u00edstup Event Sourcing sa akt\u00edvne pou\u017e\u00edva v elektronickej po\u0161te. V\u00e4\u010d\u0161ina aplik\u00e1ci\u00ed obchodn\u00edkov, kde nepretr\u017eite prich\u00e1dzaj\u00fa d\u00e1ta, je v skuto\u010dnosti postaven\u00e1 na pr\u00edstupe CQRS, aby mali mo\u017enos\u0165 filtrova\u0165 z\u00edskan\u00e9 \u00fadaje. A horizont\u00e1lne \u0161k\u00e1lovanie sa u\u017e pomerne dlho aplikuje v mnoh\u00fdch slu\u017eb\u00e1ch.<\/p>\n<p><\/p>\n<p>Av\u0161ak to najd\u00f4le\u017eitej\u0161ie je, \u017ee v\u0161etky tieto vzory sa stali ve\u013emi \u013eahko aplikovate\u013en\u00fdmi v modern\u00fdch aplik\u00e1ci\u00e1ch (ak s\u00fa na mieste, samozrejme). Cloud poskytuje sharding a horizont\u00e1lne \u0161k\u00e1lovanie hne\u010f, \u010do je ove\u013ea jednoduch\u0161ie ako objedn\u00e1va\u0165 r\u00f4zne dedikovan\u00e9 servery v r\u00f4znych d\u00e1tov\u00fdch centr\u00e1ch samostatne. CQRS sa stal ove\u013ea jednoduch\u0161\u00edm najm\u00e4 v\u010faka rozvoju kni\u017en\u00edc, ako je RX. Pred 10 rokmi by zriedka webov\u00e1 str\u00e1nka dok\u00e1zala podpori\u0165 nie\u010do tak\u00e9. Event Sourcing sa d\u00e1 nastavi\u0165 tie\u017e neuverite\u013ene jednoducho v\u010faka u\u017e hotov\u00fdm kontajnerom s Apache Kafka. Pred 10 rokmi by to bolo inov\u00e1ciou, teraz je to be\u017enos\u0165. Podobne je to aj so statick\u00fdm hostingom obsahu: v\u010faka pohodlnej\u0161\u00edm technol\u00f3giam (vr\u00e1tane dostupnej podrobnej dokument\u00e1cie a ve\u013ekej datab\u00e1zy odpoved\u00ed) sa stal tak\u00fdto pr\u00edstup e\u0161te jednoduch\u0161\u00edm.<\/p>\n<p><\/p>\n<p>Ako v\u00fdsledok, implement\u00e1cia radom pomerne zlo\u017eit\u00fdch architektonick\u00fdch vzorov sa teraz stala omnoho jednoduch\u0161ou, a preto si na \u0148u stoj\u00ed za to vopred posvieti\u0165. Ak sa v desa\u0165ro\u010dnej aplik\u00e1cii upustilo od jedn\u00e9ho z rie\u0161en\u00ed vy\u0161\u0161ie kv\u00f4li vysokej cene implement\u00e1cie a prev\u00e1dzky, teraz, v novej aplik\u00e1cii, alebo po refaktoringu, je mo\u017en\u00e9 vytvori\u0165 slu\u017ebu, ktor\u00e1 bude architektonicky roz\u0161\u00edrite\u013en\u00e1 (z h\u013eadiska v\u00fdkonu) a pripraven\u00e1 na nov\u00e9 po\u017eiadavky od klientov (napr\u00edklad na lokaliz\u00e1ciu osobn\u00fdch \u00fadajov).<\/p>\n<p><\/p>\n<p>A najd\u00f4le\u017eitej\u0161ie: pros\u00edm, nepou\u017e\u00edvajte tieto pr\u00edstupy, ak m\u00e1te jednoduch\u00fa aplik\u00e1ciu. \u00c1no, s\u00fa pekn\u00e9 a zauj\u00edmav\u00e9, av\u0161ak pre webov\u00fa str\u00e1nku s vrcholov\u00fdm po\u010dtom n\u00e1v\u0161tevn\u00edkov 100 sa \u010dasto d\u00e1 ob\u00eds\u0165 klasick\u00fdm monolitom (aspo\u0148 navonok, vo vn\u00fatri je mo\u017en\u00e9 rozbi\u0165 sa na moduly a podobne).<\/p>\n<p>Zdroj: <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.4 - 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\/sk\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47Praktick\u00e9 architektonick\u00e9 vzory | ProHoster","description":"Ahoj, Habr! V s\u00favislosti s aktu\u00e1lnymi udalos\u0165ami sp\u00f4soben\u00fdmi koronav\u00edrusom dost\u00e1va mno\u017estvo internetov\u00fdch slu\u017eieb zv\u00fd\u0161en\u00fa z\u00e1\u0165a\u017e.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/udobnye-arhitekturnye-patterny","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/80035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=80035"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/80035\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/80036"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=80035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=80035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=80035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}