{"id":31124,"date":"2019-10-31T21:39:36","date_gmt":"2019-10-31T18:39:36","guid":{"rendered":"https:\/\/prohoster.info\/blog\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\/"},"modified":"2019-10-31T21:39:36","modified_gmt":"2019-10-31T18:39:36","slug":"stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"Stavebn\u00e9 bloky distribuovan\u00fdch aplik\u00e1ci\u00ed. Druh\u00e9 pribl\u00ed\u017eenie","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Ozn\u00e1menie<\/strong><\/p>\n<p><\/p>\n<p><em>Kollega, v polovici leta pl\u00e1nujem zverejni\u0165 \u010fal\u0161\u00ed cyklus \u010dl\u00e1nkov o navrhovan\u00ed syst\u00e9mov hromadn\u00e9ho obsluhy: \u201eExperiment VTrade\u201c \u2014 pokus nap\u00edsa\u0165 framework pre obchodn\u00e9 syst\u00e9my. V cykle budeme rozobera\u0165 te\u00f3riu a prax budovania burzy, aukcie a obchodu. Na konci \u010dl\u00e1nku navrhujem hlasova\u0165 za t\u00e9my, ktor\u00e9 v\u00e1s najviac zauj\u00edmaj\u00fa.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Stavebn\u00e9 bloky distribuovan\u00fdch aplik\u00e1ci\u00ed. Druh\u00e9 pribl\u00ed\u017eenie\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je z\u00e1vere\u010dn\u00fd \u010dl\u00e1nok cyklu o distribuovan\u00fdch reakt\u00edvnych aplik\u00e1ci\u00e1ch na Erlang\/Elixir. V <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">v prvej \u010dl\u00e1nku<\/a><\/noindex> n\u00e1jdete teoretick\u00e9 z\u00e1klady reakt\u00edvnej architekt\u00fary. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Druh\u00fd \u010dl\u00e1nok<\/a><\/noindex> ilustruje z\u00e1kladn\u00e9 vzory a mechanizmy budovania tak\u00fdchto syst\u00e9mov.<\/p>\n<p><\/p>\n<p>Dnes sa budeme zaobera\u0165 ot\u00e1zkami rozvoja k\u00f3dovej z\u00e1kladne a projektov ako celku. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Organiz\u00e1cia slu\u017eieb<\/h2>\n<p><\/p>\n<p>V re\u00e1lnom \u017eivote pri v\u00fdvoji slu\u017eby \u010dasto mus\u00edme kombinova\u0165 nieko\u013eko vzorov interakcie v jednom kontrol\u00e9ri. Napr\u00edklad, slu\u017eba users, ktor\u00e1 rie\u0161i \u00falohy spr\u00e1vy profilov pou\u017e\u00edvate\u013eov projektu, mus\u00ed reagova\u0165 na po\u017eiadavky req-resp a informova\u0165 o aktualiz\u00e1ci\u00e1ch profilov cez pub-sub. Tento pr\u00edpad je pomerne jednoduch\u00fd: za messaging stoj\u00ed jeden kontrol\u00e9r, ktor\u00fd implementuje logiku slu\u017eby a publikovuje aktualiz\u00e1cie.<\/p>\n<p><\/p>\n<p>Situ\u00e1cia sa komplikuje, ke\u010f potrebujeme implementova\u0165 odoln\u00fa distribuovan\u00fa slu\u017ebu. Predpokladajme, \u017ee po\u017eiadavky na users sa zmenili: <\/p>\n<p><\/p>\n<ol>\n<li>teraz mus\u00ed slu\u017eba spracov\u00e1va\u0165 po\u017eiadavky na 5 uzloch v klastri, <\/li>\n<li>ma\u0165 schopnos\u0165 vykon\u00e1va\u0165 pozadie spracovanie \u00faloh, <\/li>\n<li>ako aj schopnos\u0165 dynamicky spravova\u0165 zoznamy prihl\u00e1senia na aktualiz\u00e1cie profilov.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>Pozn\u00e1mka:<\/em> Ot\u00e1zka konzistentn\u00e9ho ukl\u00e1dania a replik\u00e1cie \u00fadajov sa neberie do \u00favahy. Predpokladajme, \u017ee tieto ot\u00e1zky boli vyrie\u0161en\u00e9 sk\u00f4r a v syst\u00e9me u\u017e existuje spo\u013eahliv\u00e1 a \u0161k\u00e1lovate\u013en\u00e1 vrstva ukladania, pri\u010dom spracovatelia maj\u00fa mechanizmy interakcie s \u0148ou.<\/p>\n<p><\/p>\n<p>Form\u00e1lne op\u00edsanie slu\u017eby users sa skomplikovalo. Z poh\u013eadu program\u00e1tora s\u00fa v\u010faka pou\u017e\u00edvaniu messaging zmeny minim\u00e1lne. Aby sme vyhoveli prv\u00e9mu po\u017eiadavku, mus\u00edme nastavi\u0165 vyva\u017eovanie na mieste v\u00fdmeny req-resp. <\/p>\n<p><\/p>\n<p>Po\u017eiadavka na spracovanie pozad\u00ed \u00faloh sa \u010dasto vyskytuje. V u\u017e\u00edvate\u013esk\u00fdch \u00fa\u010dtoch to m\u00f4\u017eu by\u0165 kontroly dokumentov pou\u017e\u00edvate\u013eov, spracovanie nahran\u00e9ho multim\u00e9di\u00e1 alebo synchroniz\u00e1cia \u00fadajov so soci\u00e1lnymi sie\u0165ami. Tieto \u00falohy je potrebn\u00e9 nejak\u00fdm sp\u00f4sobom rozde\u013eova\u0165 v r\u00e1mci clustra a kontrolova\u0165 priebeh vykon\u00e1vania. Preto m\u00e1me dve mo\u017enosti rie\u0161enia: bu\u010f pou\u017ei\u0165 vzor rozde\u013eovania \u00faloh z predch\u00e1dzaj\u00faceho \u010dl\u00e1nku, alebo, ak ten nie je vhodn\u00fd, nap\u00edsa\u0165 vlastn\u00fd pl\u00e1nova\u010d \u00faloh, ktor\u00fd bude spravova\u0165 skupinu spracovate\u013eov tak, ako to potrebujeme. <\/p>\n<p><\/p>\n<p>3. bod vy\u017eaduje roz\u0161\u00edrenie vzoru pub-sub. A na jeho implement\u00e1ciu, po vytvoren\u00ed bodu v\u00fdmeny pub-sub, mus\u00edme navy\u0161e spusti\u0165 riadiaci prvok tohto bodu v r\u00e1mci na\u0161ich slu\u017eieb. T\u00fdmto sp\u00f4sobom akoby vy\u0165ahujeme logiku spracovania prihl\u00e1senia a odhl\u00e1senia z vrstvy messaging do implement\u00e1cie pou\u017e\u00edvate\u013eov.<\/p>\n<p><\/p>\n<p>Nakoniec, dekompoz\u00edcia \u00falohy uk\u00e1zala, \u017ee na splnenie po\u017eiadaviek potrebujeme spusti\u0165 na r\u00f4znych uzloch 5 in\u0161tanci\u00ed slu\u017eby a vytvori\u0165 dodato\u010dn\u00fa entitu \u2013 riadi\u010d pub-sub, ktor\u00fd bude zodpovedn\u00fd za prihl\u00e1senie.<br \/>\nNa spustenie 5 spracovate\u013eov nie je potrebn\u00e9 meni\u0165 k\u00f3d slu\u017eby. Jedinou dodato\u010dnou \u010dinnos\u0165ou je nastavenie pravidiel vyva\u017eovania na bode v\u00fdmeny, o \u010dom budeme hovori\u0165 nesk\u00f4r.<br \/>\nTaktie\u017e sa objavila dodato\u010dn\u00e1 zlo\u017eitost: riadi\u010d pub-sub a vlastn\u00fd pl\u00e1nova\u010d \u00faloh musia pracova\u0165 v jedinom in\u0161tanci. Op\u00e4\u0165, slu\u017eba messaging, ako fundament\u00e1lna, mus\u00ed poskytova\u0165 mechanizmus vo\u013eby l\u00eddra.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Vo\u013eba l\u00eddra<\/h3>\n<p><\/p>\n<p>V distribuovan\u00fdch syst\u00e9moch vo\u013eba l\u00eddra \u2013 proced\u00fara menovania jedin\u00e9ho procesu, ktor\u00fd zodpoved\u00e1 za pl\u00e1novanie distribuovan\u00e9ho spracovania nejak\u00e9ho za\u0165a\u017eenia. <\/p>\n<p><\/p>\n<p>V syst\u00e9moch, ktor\u00e9 nie s\u00fa naklonen\u00e9 centraliz\u00e1cii, sa pou\u017e\u00edvaj\u00fa univerz\u00e1lne algoritmy a algoritmy zalo\u017een\u00e9 na konsenze, ako napr\u00edklad paxos alebo raft.<br \/>\nKe\u010f\u017ee messaging je broker a centr\u00e1lna s\u00fa\u010das\u0165, pozn\u00e1 v\u0161etk\u00fdch riadi\u010dov slu\u017eby \u2013 kandid\u00e1tov na l\u00eddra. Messaging m\u00f4\u017ee vymenova\u0165 l\u00eddra bez vykon\u00e1vania hlasovania.<\/p>\n<p><\/p>\n<p>V\u0161etky slu\u017eby po spusten\u00ed a pripojen\u00ed k bodu v\u00fdmeny dostan\u00fa syst\u00e9mov\u00fa spr\u00e1vu <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. V pr\u00edpade, ak <code>LeaderPid<\/code> s\u00fahlas\u00ed s <code>pid<\/code> aktu\u00e1lneho procesu, je menovan\u00fd za l\u00eddra, a zoznam <code>Servers<\/code> zah\u0155\u0148a v\u0161etky uzly a ich parametre.<br \/>\nPri vzniku nov\u00e9ho a vypnut\u00ed funguj\u00faceho uzla klastera v\u0161etci spr\u00e1vcovia slu\u017eby dost\u00e1vaj\u00fa <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> a <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> pr\u00edpadne.<\/p>\n<p><\/p>\n<p>T\u00fdmto sp\u00f4sobom v\u0161etky komponenty vedia o v\u0161etk\u00fdch zmen\u00e1ch a v klasteri je v ka\u017edom okamihu zaru\u010den\u00fd jeden l\u00edder.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Proxy<\/h2>\n<p><\/p>\n<p>Na realiz\u00e1ciu zlo\u017eit\u00fdch distribuovan\u00fdch procesov spracovania a takisto pri optimaliz\u00e1cii existuj\u00facej architekt\u00fary je v\u00fdhodn\u00e9 pou\u017e\u00edva\u0165 proxy.<br \/>\nAby sme nemuseli meni\u0165 k\u00f3d slu\u017eieb a rie\u0161ili napr\u00edklad \u00falohy dodato\u010dn\u00e9ho spracovania, smerovania alebo logovania spr\u00e1v, m\u00f4\u017eeme pred slu\u017ebu zahrn\u00fa\u0165 proxy spracovate\u013ea, ktor\u00fd vykon\u00e1 v\u0161etku dodato\u010dn\u00fa pr\u00e1cu.<\/p>\n<p><\/p>\n<p>Klasick\u00fdm pr\u00edkladom optimaliz\u00e1cie pub-sub je distribuovan\u00e1 aplik\u00e1cia s obchodn\u00fdm jadrom, ktor\u00e9 generuje udalnosti aktualiz\u00e1ci\u00ed, ako napr\u00edklad zmeny cien na trhu, a pr\u00edstupov\u00e1 vrstva \u2014 N serverov poskytuj\u00facich websocket API pre webov\u00fdch klientov.<br \/>\nAk sa na probl\u00e9m pozrieme priamo, spr\u00e1va klienta vyzer\u00e1 nasledovne:<\/p>\n<p><\/p>\n<ul>\n<li>klient nadv\u00e4zuje spojenie s platformou. Na strane servera, ktor\u00fd ukon\u010duje traffic, sa sp\u00fa\u0161\u0165a proces, ktor\u00fd obsluhuje toto pripojenie.<\/li>\n<li>v r\u00e1mci obslu\u017en\u00e9ho procesu prebieha autoriz\u00e1cia a prihl\u00e1senie na aktualiz\u00e1cie. Proces vol\u00e1 met\u00f3du subscribe pre t\u00e9my.<\/li>\n<li>po vygenerovan\u00ed udalosti v jadre je t\u00e1to doru\u010den\u00e1 procesom, ktor\u00e9 obsluhuj\u00fa pripojenia.<\/li>\n<\/ul>\n<p><\/p>\n<p>Predpokladajme, \u017ee m\u00e1me 50000 odberate\u013eov na t\u00e9mu \u201enews\u201c. Odberatelia s\u00fa rovnomerne rozlo\u017een\u00fd na 5 serveroch. Nakoniec ka\u017ed\u00e1 aktualiz\u00e1cia, prich\u00e1dzaj\u00faca na v\u00fdmenn\u00e9 miesto, bude replikovan\u00e1 50000-kr\u00e1t: 10000-kr\u00e1t na ka\u017ed\u00fd server, vzh\u013eadom na po\u010det odberate\u013eov na \u0148om. Nie pr\u00e1ve efekt\u00edvna sch\u00e9ma, \u017ee?<br \/>\nAby sme situ\u00e1ciu zlep\u0161ili, zavedieme proxy s rovnak\u00fdm menom ako v\u00fdmenn\u00e9 miesto. Registr\u00e1tor glob\u00e1lnych mien by mal by\u0165 schopn\u00fd vr\u00e1ti\u0165 najbli\u017e\u0161\u00ed proces pod\u013ea mena, \u010do je d\u00f4le\u017eit\u00e9.<\/p>\n<p><\/p>\n<p>Tento proxy spust\u00edme na serveroch pr\u00edstupovej vrstvy a v\u0161etky na\u0161e procesy, ktor\u00e9 obsluhuj\u00fa websocket API, sa na\u0148 prihl\u00e1sia, a nie na p\u00f4vodn\u00fd pub-sub v\u00fdmenn\u00fd bod v jadre. Proxy sa prihl\u00e1s\u00ed na jadro iba v pr\u00edpade jedine\u010dnej prihl\u00e1\u0161ky a replikovanej prijatej spr\u00e1vy v\u0161etk\u00fdm svojim odberate\u013eom.<br \/>\nNakoniec bude medzi jadrom a pr\u00edstupov\u00fdmi servermi prenesen\u00fdch 5 spr\u00e1v, namiesto 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Smerovanie a vyva\u017eovanie<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>V aktu\u00e1lnej implement\u00e1cii messaging existuje 7 strat\u00e9gi\u00ed rozde\u013eovania po\u017eiadaviek:<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. Dopyt sa posiela v\u0161etk\u00fdm kontrol\u00f3rom.<\/li>\n<li><code>round-robin<\/code>. Prebieha preberanie a cyklick\u00e9 rozde\u013eovanie dopytov medzi kontrol\u00f3ry.<\/li>\n<li><code>konsenzus<\/code>. Kontrol\u00f3ry zabezpe\u010duj\u00face slu\u017ebu sa delia na l\u00eddra a n\u00e1sledn\u00edkov. Dopyty s\u00fa posielan\u00e9 len l\u00eddrovi.<\/li>\n<li><code>konsenzus &amp; round-robin<\/code>. V skupine je l\u00edder, ale dopyty s\u00fa rozde\u013eovan\u00e9 medzi v\u0161etk\u00fdch \u010dlenov.<\/li>\n<li><code>sticky<\/code>. Vypo\u010d\u00edta sa hash funkcia a pridel\u00ed sa konkr\u00e9tnemu spracovate\u013eovi. N\u00e1sledn\u00e9 dopyty s touto signat\u00farou prejd\u00fa k tomuto spracovate\u013eovi.<\/li>\n<li><code>sticky-fun<\/code>. Pri inicializ\u00e1cii v\u00fdmenn\u00e9ho bodu je navy\u0161e pridan\u00e1 funkcia na v\u00fdpo\u010det hash pre <code>sticky<\/code> vyv\u00e1\u017eenie.<\/li>\n<li><code>z\u00e1bava<\/code>. Podobne ako sticky-fun, len navy\u0161e m\u00f4\u017ee by\u0165 presmerovan\u00fd, odmietnut\u00fd alebo predspracovan\u00fd. <\/li>\n<\/ul>\n<p><\/p>\n<p>Strat\u00e9gia rozde\u013eovania sa ur\u010duje pri inicializ\u00e1cii v\u00fdmenn\u00e9ho bodu.<\/p>\n<p><\/p>\n<p>Okrem vyv\u00e1\u017eenia messaging umo\u017e\u0148uje ozna\u010dovanie ent\u00edt. Pozrime sa na typy zna\u010diek v syst\u00e9me:<\/p>\n<p><\/p>\n<ul>\n<li>Zna\u010dka pripojenia. Umo\u017e\u0148uje pochopi\u0165, cez ak\u00e9 pripojenie pri\u0161li udalosti. Pou\u017e\u00edva sa, ke\u010f sa proces kontrol\u00f3ra prip\u00e1ja k jedn\u00e9mu v\u00fdmenn\u00e9mu bodu, ale s r\u00f4znymi k\u013e\u00fa\u010dmi smerovania. <\/li>\n<li>Zna\u010dka slu\u017eby. Umo\u017e\u0148uje pre jednu slu\u017ebu zoskupi\u0165 spracovate\u013eov a roz\u0161\u00edri\u0165 mo\u017enosti smerovania a vyv\u00e1\u017eenia. Pre vzor req-resp je smerovanie line\u00e1rne. Posielame dopyt na v\u00fdmenn\u00fd bod, \u010falej ho odovzd\u00e1 slu\u017ebe. Ak ale potrebujeme rozdeli\u0165 spracovate\u013eov na logick\u00e9 skupiny, rozdelenie sa uskuto\u010d\u0148uje pomocou zna\u010diek. Pri uveden\u00ed zna\u010dky bude dopyt smerovan\u00fd na konkr\u00e9tnu skupinu kontrol\u00f3rov.<\/li>\n<li>Zna\u010dka dopytu. Umo\u017e\u0148uje odl\u00ed\u0161i\u0165 odpovede. Ke\u010f\u017ee n\u00e1\u0161 syst\u00e9m je asynchr\u00f3nny, pre spracovanie odpoved\u00ed slu\u017eby treba ma\u0165 mo\u017enos\u0165 uvies\u0165 RequestTag pri odosielan\u00ed dopytu. Pod\u013ea neho budeme m\u00f4c\u0165 zisti\u0165, odpove\u010f na ktor\u00fd dopyt k n\u00e1m pri\u0161la.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>Pre pub-sub je to trochu jednoduch\u0161ie. M\u00e1me v\u00fdmenn\u00fd bod, na ktor\u00fd s\u00fa publikovan\u00e9 spr\u00e1vy. V\u00fdmenn\u00fd bod rozde\u013euje spr\u00e1vy medzi predplatite\u013eov, ktor\u00ed sa prihl\u00e1sili na potrebn\u00e9 k\u013e\u00fa\u010de smerovania (m\u00f4\u017eeme poveda\u0165, \u017ee je to obdobn\u00e9 t\u00e9mam).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">\u0160k\u00e1lovate\u013enos\u0165 a odolnos\u0165 vo\u010di poruch\u00e1m<\/h2>\n<p><\/p>\n<p>\u0160k\u00e1lovate\u013enos\u0165 syst\u00e9mu ako celku z\u00e1vis\u00ed od stup\u0148a \u0161k\u00e1lovate\u013enosti vrstiev a komponentov syst\u00e9mu:<\/p>\n<p><\/p>\n<ul>\n<li>Slu\u017eby sa \u0161k\u00e1luj\u00fa pridan\u00edm \u010fal\u0161\u00edch uzlov s obslu\u017en\u00fdmi programami tohto servisu do klastru. Po\u010das prev\u00e1dzky je mo\u017en\u00e9 zvoli\u0165 optim\u00e1lnu politiku vyva\u017eovania.<\/li>\n<li>S\u00e1m servis messaging v r\u00e1mci samostatn\u00e9ho klastru sa vo v\u0161eobecnosti \u0161k\u00e1luje bu\u010f presunut\u00edm zvl\u00e1\u0161\u0165 za\u0165a\u017een\u00fdch v\u00fdmenn\u00fdch bodov na samostatn\u00e9 uzly klastru, alebo pridan\u00edm procesov proxy do osobitne za\u0165a\u017een\u00fdch oblast\u00ed klastru.<\/li>\n<li>\u0160k\u00e1lovate\u013enos\u0165 cel\u00e9ho syst\u00e9mu ako charakteristika z\u00e1vis\u00ed od flexibility architekt\u00fary a mo\u017enosti zl\u00fa\u010denia jednotliv\u00fdch klastra do spolo\u010dnej logickej entity.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00daspech projektu \u010dasto z\u00e1vis\u00ed na jednoducho a r\u00fdchlosti \u0161k\u00e1lovania. Messaging v s\u00fa\u010dasnej podobe rastie spolu s aplik\u00e1ciou. Aj ke\u010f n\u00e1m ch\u00fdba klaster s 50-60 strojmi, m\u00f4\u017eeme vyu\u017ei\u0165 feder\u00e1ciu. Bohu\u017eia\u013e, t\u00e9ma federovania presahuje r\u00e1mec tohto \u010dl\u00e1nku.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Z\u00e1lohovanie<\/h2>\n<p><\/p>\n<p>Pri rozoberan\u00ed vyv\u00e1\u017eenia za\u0165a\u017eenia sme u\u017e diskutovali o z\u00e1lohovan\u00ed kontrol\u00e9rov slu\u017eieb. Av\u0161ak messaging by mal by\u0165 tie\u017e z\u00e1lohovan\u00fd. V pr\u00edpade zlyhania uzla alebo stroja by sa messaging mal automaticky obnovi\u0165, a to v \u010do najkrat\u0161om \u010dase.<\/p>\n<p><\/p>\n<p>Vo svojich projektoch pou\u017e\u00edvam \u010fal\u0161ie uzly, ktor\u00e9 prevzaj\u00fa za\u0165a\u017eenie v pr\u00edpade zlyhania. V Erlangu existuje \u0161tandardn\u00e1 implement\u00e1cia distribuovan\u00e9ho re\u017eimu pre aplik\u00e1cie OTP. Distribuovan\u00fd re\u017eim zabezpe\u010duje obnovu v pr\u00edpade chyby spusten\u00edm havarovanej aplik\u00e1cie na inom predom spustenom uzle. Proces je transparentn\u00fd, po zlyhan\u00ed aplik\u00e1cia automaticky prejde na failover uzol. O tejto funk\u010dnosti sa m\u00f4\u017eete do\u010d\u00edta\u0165 viac. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">tu<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">V\u00fdkon<\/h2>\n<p><\/p>\n<p>Pok\u00fasime sa aspo\u0148 pribli\u017ene porovna\u0165 v\u00fdkon rabbitmq a n\u00e1\u0161ho vlastn\u00e9ho messagingu.<br \/>\nNa\u0161iel som <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">ofici\u00e1lne v\u00fdsledky<\/a><\/noindex> testovania rabbitmq od t\u00edmu openstack.<\/p>\n<p><\/p>\n<p>V bode 6.14.1.2.1.2.2. origin\u00e1lneho dokumentu s\u00fa prezentovan\u00e9 v\u00fdsledky RPC CAST:<br \/>\n<img decoding=\"async\" alt=\"Stavebn\u00e9 bloky distribuovan\u00fdch aplik\u00e1ci\u00ed. Druh\u00e9 pribl\u00ed\u017eenie\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Predbe\u017ene nebudeme vykon\u00e1va\u0165 \u017eiadne \u010fal\u0161ie nastavenia v jadre OS alebo erlang VM. Podmienky pre testovanie:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Test v r\u00e1mci jedn\u00e9ho uzla erlang sa sp\u00fa\u0161\u0165a na notebooku so star\u0161\u00edm i7 v mobilnom preveden\u00ed.<\/li>\n<li>Klastrov\u00e9 testy prebiehaj\u00fa na serveroch s 10G sie\u0165ou.<\/li>\n<li>K\u00f3d be\u017e\u00ed v docker kontajneroch. Sie\u0165 je v re\u017eime NAT.<\/li>\n<\/ul>\n<p><\/p>\n<p>K\u00f3d testu:<\/p>\n<p><\/p>\n<pre><code class=\"erlang\">req_resp_bench(_) -&gt;\n  W = perftest:comprehensive(10000,\n    fun() -&gt;\n      messaging:request(?EXCHANGE, default, ping, self()),\n      receive\n        #'$msg'{message = pong} -&gt; ok\n      after 5000 -&gt;\n        throw(timeout)\n      end\n    end\n  ),\n  true = lists:any(fun(E) -&gt; E &gt;= 30000 end, W),\n  ok.<\/code><\/pre>\n<p><\/p>\n<p><em>Scen\u00e1r 1:<\/em> Test sa sp\u00fa\u0161\u0165a na star\u0161om mobilnom i7 prenosnom po\u010d\u00edta\u010di. Test, messaging a slu\u017eba be\u017eia na jednom uzle v jednom docker kontajneri:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sekven\u010dn\u00e9 10000 cyklov v ~0 sekund\u00e1ch (26987 cyklov\/s)\nSekven\u010dn\u00e9 20000 cyklov v ~1 sekunde (26915 cyklov\/s)\nSekven\u010dn\u00e9 100000 cyklov v ~4 sekund\u00e1ch (26957 cyklov\/s)\nParaleln\u00fd 2 100000 cyklov v ~2 sekund\u00e1ch (44240 cyklov\/s)\nParaleln\u00fd 4 100000 cyklov v ~2 sekund\u00e1ch (53459 cyklov\/s)\nParaleln\u00fd 10 100000 cyklov v ~2 sekund\u00e1ch (52283 cyklov\/s)\nParaleln\u00fd 100 100000 cyklov v ~3 sekund\u00e1ch (49317 cyklov\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Scen\u00e1r 2<\/em>: 3 uzly spusten\u00e9 na r\u00f4znych strojoch pod docker (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sekven\u010dn\u00e9 10000 cyklov v ~1 sekunde (8684 cyklov\/s)\nSekven\u010dn\u00e9 20000 cyklov v ~2 sekund\u00e1ch (8424 cyklov\/s)\nSekven\u010dn\u00e9 100000 cyklov v ~12 sekund\u00e1ch (8655 cyklov\/s)\nParaleln\u00fd 2 100000 cyklov v ~7 sekund\u00e1ch (15160 cyklov\/s)\nParaleln\u00fd 4 100000 cyklov v ~5 sekund\u00e1ch (19133 cyklov\/s)\nParaleln\u00fd 10 100000 cyklov v ~4 sekund\u00e1ch (24399 cyklov\/s)\nParaleln\u00fd 100 100000 cyklov v ~3 sekund\u00e1ch (34517 cyklov\/s)<\/code><\/pre>\n<p><\/p>\n<p>V v\u0161etk\u00fdch pr\u00edpadoch nepresiahla vyu\u017eite\u013enos\u0165 CPU 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Zhrnutie<\/h2>\n<p><\/p>\n<p>D\u00fafam, \u017ee tento cyklus nevypad\u00e1 ako v\u00fdlev vedomia a m\u00f4j z\u00e1\u017eitok prinesie skuto\u010dn\u00fd prospech ako v\u00fdskumn\u00edkom rozdelen\u00fdch syst\u00e9mov, tak i praktikom, ktor\u00ed s\u00fa na za\u010diatku svojej cesty budovania rozdelen\u00fdch architekt\u00far pre svoje podnikov\u00e9 syst\u00e9my a s z\u00e1ujmom sa pozeraj\u00fa na Erlang\/Elixir, ale pochybuj\u00fa, \u010di to stoj\u00ed za to\u2026<\/p>\n<p><\/p>\n<p>Foto <noindex><a rel=\"nofollow\" href=\"https:\/\/unsplash.com\/photos\/Q4bmoSPJM18\">@chuttersnap<\/a><\/noindex><\/p>\n<p class=\"for_users_only_msg\">Len registrovan\u00ed pou\u017e\u00edvatelia sa m\u00f4\u017eu z\u00fa\u010dastni\u0165 prieskumu. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Prihl\u00e1ste sa<\/a><\/noindex>, pros\u00edm.<\/p>\n<h2 class=\"default-block__polling-title\">Ak\u00e9 t\u00e9my by som mal podrobne osvetli\u0165 v r\u00e1mci cyklu 'Experiment VTrade'?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Te\u00f3ria: Trhy, objedn\u00e1vky a ich platnos\u0165: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Kniha objedn\u00e1vok. Te\u00f3ria a prax realiz\u00e1cie knihy s agreg\u00e1ciami<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Vizualiz\u00e1cia obchodovania: T\u00edky, bary, rozl\u00ed\u0161enia. Ako uklada\u0165 a ako kombinova\u0165<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Backoffice. Pl\u00e1novanie a v\u00fdvoj. Kontrola zamestnancov a vy\u0161etrovanie incidentov<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Pozrieme sa na to, ak\u00e9 rozhrania s\u00fa potrebn\u00e9 a ako ich realizova\u0165<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ukladanie inform\u00e1ci\u00ed: PostgreSQL, Timescale, Tarantool v obchodn\u00fdch syst\u00e9moch<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reaktivita v obchodn\u00fdch syst\u00e9moch<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    In\u00e9. Nap\u00ed\u0161em v koment\u00e1roch<\/p>\n<\/li>\n<\/ul>\n<p>    Hlasovalo 6 pou\u017e\u00edvate\u013eov. Zdr\u017eali sa 4 pou\u017e\u00edvatelia.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446344\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0412 \u0446\u0438\u043a\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d\u0430 \u0442\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0431\u0438\u0440\u0436\u0438, \u0430\u0443\u043a\u0446\u0438\u043e\u043d\u0430 \u0438 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430. \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u0442\u044c \u0437\u0430 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u0432\u0430\u043c \u0442\u0435\u043c\u044b. \u042d\u0442\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u0446\u0438\u043a\u043b\u0430 \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23092,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31124","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.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445.\" \/>\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\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\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\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\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=\"2019-10-31T18:39:36+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:39:36+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\udd47Stavebn\u00e9 bloky distribuovan\u00fdch aplik\u00e1ci\u00ed. Druh\u00e9 pribl\u00ed\u017eenie | ProHoster","description":"Ozn\u00e1menie: Kolegovia, v polovici leta pl\u00e1nujem vyda\u0165 \u010fal\u0161\u00ed cyklus \u010dl\u00e1nkov o navrhovan\u00ed syst\u00e9mov hromadn\u00e9ho obsluhy: 'Experiment VTrade' \u2014 pokus nap\u00edsa\u0165 framework pre obchodovanie.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","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\u0421\u0442\u0440\u043e\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0412\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435 | ProHoster","og:description":"\u0410\u043d\u043e\u043d\u0441 \u041a\u043e\u043b\u043b\u0435\u0433\u0438, \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u043b\u0435\u0442\u0430 \u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u044e \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0446\u0438\u043a\u043b \u0441\u0442\u0430\u0442\u0435\u0439 \u043f\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0430\u0441\u0441\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f: \u201c\u042d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 VTrade\u201d \u2014 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0442\u043e\u0440\u0433\u043e\u0432\u044b\u0445.","og:url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","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":"2019-10-31T18:39:36+00:00","article:modified_time":"2019-10-31T18:39:36+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31124","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":"2026-01-21 04:39:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:22:34","updated":"2026-01-21 04:39:19","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\/31124","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=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}