{"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\/cs\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"Stavebn\u00ed bloky distribuovan\u00fdch aplikac\u00ed. Druh\u00e9 p\u0159ibl\u00ed\u017een\u00ed","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Ozn\u00e1men\u00ed<\/strong><\/p>\n<p><\/p>\n<p><em>Kolegyn\u011b, uprost\u0159ed l\u00e9ta pl\u00e1nuji vydat dal\u0161\u00ed cyklus \u010dl\u00e1nk\u016f o n\u00e1vrhu syst\u00e9m\u016f hromadn\u00e9ho obsluhov\u00e1n\u00ed: \u201eExperiment VTrade\u201c \u2014 pokus o naps\u00e1n\u00ed frameworku pro obchodn\u00ed syst\u00e9my. V cyklu bude rozebr\u00e1na teorie a praxe budov\u00e1n\u00ed burzy, aukce a obchodu. Na konci \u010dl\u00e1nku navrhuji hlasovat o nejzaj\u00edmav\u011bj\u0161\u00edch t\u00e9matech pro v\u00e1s.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Stavebn\u00ed bloky distribuovan\u00fdch aplikac\u00ed. Druh\u00e9 p\u0159ibl\u00ed\u017een\u00ed\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Toto je z\u00e1v\u011bre\u010dn\u00fd \u010dl\u00e1nek cyklu o distribuovan\u00fdch reaktivn\u00edch aplikac\u00edch v Erlangu\/Elixiru. V <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">v prvn\u00edm \u010dl\u00e1nku<\/a><\/noindex> lze naj\u00edt teoretick\u00e9 z\u00e1klady reaktivn\u00ed architektury. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Druh\u00fd \u010dl\u00e1nek<\/a><\/noindex> ilustruje hlavn\u00ed vzory a mechanizmy budov\u00e1n\u00ed takov\u00fdch syst\u00e9m\u016f.<\/p>\n<p><\/p>\n<p>Dnes se zab\u00fdv\u00e1me ot\u00e1zkami rozvoje k\u00f3dov\u00e9 z\u00e1kladny a projekt\u016f jako celku. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Organizace slu\u017eeb<\/h2>\n<p><\/p>\n<p>Ve skute\u010dn\u00e9m \u017eivot\u011b p\u0159i v\u00fdvoji slu\u017eby \u010dasto mus\u00edme spojit n\u011bkolik vzor\u016f interakce v jednom kontrol\u00e9ru. Nap\u0159\u00edklad slu\u017eba users, kter\u00e1 \u0159e\u0161\u00ed \u00fakoly spr\u00e1vy profil\u016f u\u017eivatel\u016f projektu, by m\u011bla reagovat na po\u017eadavky req-resp a informovat o aktualizac\u00edch profil\u016f prost\u0159ednictv\u00edm pub-sub. Tato situace je docela jednoduch\u00e1: za messagingem stoj\u00ed jeden kontrol\u00e9r, kter\u00fd realizuje logiku slu\u017eby a publikuje aktualizace.<\/p>\n<p><\/p>\n<p>Situace se komplikuje, kdy\u017e pot\u0159ebujeme realizovat odolnou distribuovanou slu\u017ebu. P\u0159edstavme si, \u017ee po\u017eadavky na users se zm\u011bnily: <\/p>\n<p><\/p>\n<ol>\n<li>nyn\u00ed by slu\u017eba m\u011bla zpracov\u00e1vat po\u017eadavky na 5 uzlech clusteru, <\/li>\n<li>m\u00edt mo\u017enost vykon\u00e1vat \u00fakoly na pozad\u00ed, <\/li>\n<li>a tak\u00e9 um\u011bt dynamicky \u0159\u00eddit seznamy p\u0159edplatitel\u016f pro aktualizace profil\u016f.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>Pozn\u00e1mka:<\/em> Ot\u00e1zku konzistentn\u00edho ulo\u017een\u00ed a replikace dat zde ne\u0159e\u0161\u00edme. P\u0159edpokl\u00e1dejme, \u017ee tyto ot\u00e1zky byly vy\u0159e\u0161eny d\u0159\u00edve a v syst\u00e9mu ji\u017e existuje spolehliv\u00e1 a \u0161k\u00e1lovateln\u00e1 vrstva ukl\u00e1d\u00e1n\u00ed, a zpracovatel\u00e9 maj\u00ed mechanismy interakce s n\u00ed.<\/p>\n<p><\/p>\n<p>Form\u00e1ln\u00ed popis slu\u017eby users se zkomplikoval. Z pohledu program\u00e1tora d\u00edky pou\u017eit\u00ed messagingu jsou zm\u011bny minim\u00e1ln\u00ed. Abychom splnili prvn\u00ed po\u017eadavek, mus\u00edme nastavit vyva\u017eov\u00e1n\u00ed na bod\u011b v\u00fdm\u011bny req-resp. <\/p>\n<p><\/p>\n<p>Po\u017eadavek na zpracov\u00e1n\u00ed pozad\u00ed se \u010dasto objevuje. V u\u017eivatelsk\u00fdch \u00fa\u010dtech to mohou b\u00fdt kontroly u\u017eivatelsk\u00fdch dokument\u016f, zpracov\u00e1n\u00ed nahran\u00fdch multimedi\u00e1ln\u00edch soubor\u016f nebo synchronizace dat se soci\u00e1ln\u00edmi s\u00edt\u011bmi. Tyto \u00fakoly je pot\u0159eba n\u011bjak rozd\u011blit v r\u00e1mci clusteru a sledovat jejich pr\u016fb\u011bh. Proto m\u00e1me dv\u011b mo\u017enosti \u0159e\u0161en\u00ed: bu\u010f pou\u017e\u00edt \u0161ablonu rozd\u011blov\u00e1n\u00ed \u00faloh z p\u0159edchoz\u00edho \u010dl\u00e1nku, nebo, pokud ta nevyhovuje, napsat vlastn\u00ed pl\u00e1nova\u010d \u00faloh, kter\u00fd bude \u0159\u00eddit pool zpracovatel\u016f podle na\u0161ich pot\u0159eb. <\/p>\n<p><\/p>\n<p>Bod 3 vy\u017eaduje roz\u0161\u00ed\u0159en\u00ed \u0161ablony pub-sub. A pro implementaci, po vytvo\u0159en\u00ed bodu v\u00fdm\u011bny pub-sub, mus\u00edme nav\u00edc spustit kontroler tohoto bodu v r\u00e1mci na\u0161eho servisu. T\u00edmto zp\u016fsobem jako bychom p\u0159enesli logiku zpracov\u00e1n\u00ed p\u0159ihl\u00e1\u0161en\u00ed a odhl\u00e1\u0161en\u00ed z vrstvy messaging do implementace u\u017eivatel\u016f.<\/p>\n<p><\/p>\n<p>V\u00fdsledkem dekompozice \u00fakolu bylo, \u017ee pro spln\u011bn\u00ed po\u017eadavk\u016f pot\u0159ebujeme spustit na r\u016fzn\u00fdch uzlech 5 instanc\u00ed slu\u017eby a vytvo\u0159it dal\u0161\u00ed entitu \u2013 kontroler pub-sub, zodpov\u011bdn\u00fd za p\u0159ihl\u00e1\u0161en\u00ed.<br \/>\nPro spu\u0161t\u011bn\u00ed 5 zpracovatel\u016f nen\u00ed pot\u0159eba m\u011bnit k\u00f3d slu\u017eby. Jedin\u00e1 dodate\u010dn\u00e1 akce \u2013 nastaven\u00ed pravidel vyva\u017eov\u00e1n\u00ed na bod\u011b v\u00fdm\u011bny, o \u010dem\u017e si promluv\u00edme pozd\u011bji.<br \/>\nTak\u00e9 se objevila dal\u0161\u00ed slo\u017eitost: kontroler pub-sub a vlastn\u00ed pl\u00e1nova\u010d \u00faloh mus\u00ed fungovat v jedin\u00e9 instanci. Op\u011bt, slu\u017eba messaging, jako z\u00e1kladn\u00ed, by m\u011bla poskytovat mechanismus v\u00fdb\u011bru l\u00eddra.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">V\u00fdb\u011br l\u00eddra<\/h3>\n<p><\/p>\n<p>V distribuovan\u00fdch syst\u00e9mech je v\u00fdb\u011br l\u00eddra postup ur\u010den\u00ed jedin\u00e9 instance, kter\u00e1 je odpov\u011bdn\u00e1 za pl\u00e1nov\u00e1n\u00ed distribuovan\u00e9ho zpracov\u00e1n\u00ed n\u011bjak\u00e9ho zat\u00ed\u017een\u00ed. <\/p>\n<p><\/p>\n<p>V syst\u00e9mech, kter\u00e9 nejsou n\u00e1chyln\u00e9 k centralizaci, se pou\u017e\u00edvaj\u00ed univerz\u00e1ln\u00ed algoritmy a algoritmy zalo\u017een\u00e9 na konsensu, nap\u0159\u00edklad paxos nebo raft.<br \/>\nProto\u017ee messaging je broker a centr\u00e1ln\u00ed prvek, v\u00ed o v\u0161ech kontrolerech slu\u017eby \u2013 kandid\u00e1tech na l\u00eddra. Messaging m\u016f\u017ee jmenovat l\u00eddra bez prov\u00e1d\u011bn\u00ed hlasov\u00e1n\u00ed.<\/p>\n<p><\/p>\n<p>V\u0161echny slu\u017eby po spu\u0161t\u011bn\u00ed a p\u0159ipojen\u00ed k bodu v\u00fdm\u011bny obdr\u017e\u00ed syst\u00e9movou zpr\u00e1vu <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. V p\u0159\u00edpad\u011b, \u017ee <code>LeaderPid<\/code> souhlas\u00ed s <code>pid<\/code> aktu\u00e1ln\u00edm procesem, je jmenov\u00e1n l\u00eddrem a seznam <code>Servers<\/code> obsahuje v\u0161echny uzly a jejich parametry.<br \/>\nP\u0159i vzniku nov\u00e9ho a odpojen\u00ed funguj\u00edc\u00edho uzlu clustera obdr\u017e\u00ed v\u0161echny \u0159\u00eddic\u00ed prvky slu\u017eby <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> a <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> odpov\u00eddaj\u00edc\u00edm zp\u016fsobem.<\/p>\n<p><\/p>\n<p>Tak maj\u00ed v\u0161echny komponenty p\u0159ehled o v\u0161ech zm\u011bn\u00e1ch a v clusteru je v ka\u017ed\u00e9m okam\u017eiku zaru\u010den\u011b jeden l\u00eddr.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Zprost\u0159edkovatel\u00e9<\/h2>\n<p><\/p>\n<p>Pro realizaci slo\u017eit\u00fdch distribuovan\u00fdch proces\u016f zpracov\u00e1n\u00ed a tak\u00e9 pro optimalizaci ji\u017e existuj\u00edc\u00ed architektury je pohodln\u00e9 pou\u017e\u00edt zprost\u0159edkovatele.<br \/>\nAbychom nemuseli m\u011bnit k\u00f3d slu\u017eeb a vypo\u0159\u00e1dali se nap\u0159\u00edklad s \u00fakoly dodate\u010dn\u00e9ho zpracov\u00e1n\u00ed, sm\u011brov\u00e1n\u00ed nebo logov\u00e1n\u00ed zpr\u00e1v, m\u016f\u017eeme p\u0159ed slu\u017ebou nasadit proxy zpracovatele, kter\u00fd provede ve\u0161kerou dodate\u010dnou pr\u00e1ci.<\/p>\n<p><\/p>\n<p>Klasick\u00fdm p\u0159\u00edkladem optimalizace pub-sub je distribuovan\u00e1 aplikace s obchodn\u00edm j\u00e1drem, kter\u00e9 generuje ud\u00e1losti aktualizac\u00ed, nap\u0159\u00edklad zm\u011bnu ceny na trhu, a vrstva p\u0159\u00edstupu \u2014 N server\u016f, kter\u00e9 poskytuj\u00ed websocket API pro webov\u00e9 klienty.<br \/>\nPokud bychom p\u0159istoupili k situaci \"doslovn\u011b\", pak obsluha klienta vypad\u00e1 n\u00e1sledovn\u011b:<\/p>\n<p><\/p>\n<ul>\n<li>klient navazuje spojen\u00ed s platformou. Na stran\u011b serveru, kter\u00fd ukon\u010duje provoz, doch\u00e1z\u00ed k spu\u0161t\u011bn\u00ed procesu, kter\u00fd obsluhuje toto p\u0159ipojen\u00ed.<\/li>\n<li>v kontextu obslu\u017en\u00e9ho procesu doch\u00e1z\u00ed k autorizaci a p\u0159ihl\u00e1\u0161en\u00ed na aktualizace. Proces vol\u00e1 metodu subscribe pro t\u00e9mata.<\/li>\n<li>po vygenerov\u00e1n\u00ed ud\u00e1losti v j\u00e1d\u0159e je doru\u010dena proces\u016fm, kter\u00e9 obsluhuj\u00ed p\u0159ipojen\u00ed.<\/li>\n<\/ul>\n<p><\/p>\n<p>P\u0159edstavme si, \u017ee m\u00e1me 50000 odb\u011bratel\u016f na t\u00e9ma \u201cnews\u201d. Odb\u011bratel\u00e9 jsou rovnom\u011brn\u011b rozlo\u017eeni na 5 serverech. V d\u016fsledku toho bude ka\u017ed\u00e1 aktualizace, kter\u00e1 doraz\u00ed na sm\u011bnu, replikov\u00e1na 50000kr\u00e1t: 10000kr\u00e1t na ka\u017ed\u00fd server, podle po\u010dtu odb\u011bratel\u016f na n\u011bm. Nen\u00ed to \u00fapln\u011b efektivn\u00ed sch\u00e9ma, \u017ee?<br \/>\nAbychom zlep\u0161ili situaci, zav\u00e1d\u00edme proxy, kter\u00e9 m\u00e1 stejn\u00e9 jm\u00e9no jako sm\u011bna. Registrar glob\u00e1ln\u00edch jmen by m\u011bl um\u011bt vr\u00e1tit nejbli\u017e\u0161\u00ed proces podle jm\u00e9na, to je d\u016fle\u017eit\u00e9.<\/p>\n<p><\/p>\n<p>Spust\u00edme tuto proxy na serverech p\u0159\u00edstupov\u00e9 vrstvy, a v\u0161echny na\u0161e procesy, kter\u00e9 obsluhuj\u00ed websocket API, se na ni p\u0159ihl\u00e1s\u00ed, a ne na p\u016fvodn\u00ed pub-sub sm\u011bnu v j\u00e1d\u0159e. Proxy se p\u0159ihl\u00e1s\u00ed k j\u00e1dru pouze v p\u0159\u00edpad\u011b jedine\u010dn\u00e9ho p\u0159ihl\u00e1\u0161en\u00ed a replikovan\u00e1 zpr\u00e1va se \u0161\u00ed\u0159\u00ed ke v\u0161em jej\u00edm odb\u011bratel\u016fm.<br \/>\nNakonec mezi j\u00e1drem a p\u0159\u00edstupov\u00fdmi servery bude odesl\u00e1no 5 zpr\u00e1v m\u00edsto 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Sm\u011brov\u00e1n\u00ed a vyva\u017eov\u00e1n\u00ed<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>V aktu\u00e1ln\u00ed implementaci messaging existuje 7 strategi\u00ed distribuce po\u017eadavk\u016f:<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. Dotaz je zas\u00edl\u00e1n v\u0161em kontrol\u00e9r\u016fm.<\/li>\n<li><code>round-robin<\/code>. Provede se proch\u00e1zen\u00ed a cyklick\u00e9 rozd\u011blov\u00e1n\u00ed dotaz\u016f mezi kontrol\u00e9ry.<\/li>\n<li><code>konsenzus<\/code>. Kontrol\u00e9ry, kter\u00e9 obsluhuj\u00ed slu\u017ebu, se d\u011bl\u00ed na l\u00eddra a n\u00e1sledovn\u00edky. Dotazy jsou p\u0159ed\u00e1v\u00e1ny pouze l\u00eddrovi.<\/li>\n<li><code>konsenzus &amp; round-robin<\/code>. Ve skupin\u011b je l\u00eddr, ale dotazy se rozd\u011bluj\u00ed mezi v\u0161echny \u010dleny.<\/li>\n<li><code>sticky<\/code>. Vypo\u010d\u00edt\u00e1 se hash funkce a p\u0159i\u0159ad\u00ed se k ur\u010dit\u00e9mu zpracov\u00e1v\u00e1\u010di. N\u00e1sleduj\u00edc\u00ed dotazy s touto zna\u010dkou p\u0159ich\u00e1zej\u00ed k tomuto zpracov\u00e1v\u00e1\u010di.<\/li>\n<li><code>sticky-fun<\/code>. P\u0159i inicializaci v\u00fdm\u011bny se nav\u00edc p\u0159ed\u00e1v\u00e1 funkce pro v\u00fdpo\u010det hashe pro <code>sticky<\/code> vyrovn\u00e1v\u00e1n\u00ed.<\/li>\n<li><code>z\u00e1bava<\/code>. Analogick\u00e9 ke sticky-fun, ale nav\u00edc je mo\u017en\u00e9 p\u0159esm\u011brovat, odm\u00edtnout nebo p\u0159edzpracovat. <\/li>\n<\/ul>\n<p><\/p>\n<p>Strategie rozd\u011blov\u00e1n\u00ed se ur\u010duje p\u0159i inicializaci v\u00fdm\u011bny.<\/p>\n<p><\/p>\n<p>Krom\u011b vyrovn\u00e1v\u00e1n\u00ed messaging umo\u017e\u0148uje zna\u010dkovat entity. Zva\u017eme typy zna\u010dek v syst\u00e9mu:<\/p>\n<p><\/p>\n<ul>\n<li>Zna\u010dka p\u0159ipojen\u00ed. Umo\u017e\u0148uje pochopit, skrze jak\u00e9 p\u0159ipojen\u00ed p\u0159i\u0161ly ud\u00e1losti. Pou\u017e\u00edv\u00e1 se, kdy\u017e se proces kontrol\u00e9ru p\u0159ipojuje k jednomu bodu v\u00fdm\u011bny, ale s r\u016fzn\u00fdmi kl\u00ed\u010di pro sm\u011brov\u00e1n\u00ed. <\/li>\n<li>Zna\u010dka slu\u017eby. Umo\u017e\u0148uje pro jednu slu\u017ebu spojovat do skupin zpracovatele a roz\u0161i\u0159ovat mo\u017enosti sm\u011brov\u00e1n\u00ed a vyrovn\u00e1v\u00e1n\u00ed. Pro vzor req-resp je sm\u011brov\u00e1n\u00ed line\u00e1rn\u00ed. Odes\u00edl\u00e1me dotaz na bod v\u00fdm\u011bny, ten d\u00e1le p\u0159ed\u00e1v\u00e1 slu\u017eb\u011b. Pokud v\u0161ak chceme rozd\u011blit zpracovatele do logick\u00fdch skupin, rozd\u011blen\u00ed se prov\u00e1d\u00ed pomoc\u00ed zna\u010dek. P\u0159i uveden\u00ed zna\u010dky bude dotaz sm\u011b\u0159ov\u00e1n na konkr\u00e9tn\u00ed skupinu kontrol\u00e9r\u016f.<\/li>\n<li>Zna\u010dka dotazu. Umo\u017e\u0148uje odli\u0161it odpov\u011bdi. Proto\u017ee n\u00e1\u0161 syst\u00e9m je asynchronn\u00ed, pro zpracov\u00e1n\u00ed odpov\u011bd\u00ed slu\u017eby je pot\u0159eba m\u00edt mo\u017enost uv\u00e9st RequestTag p\u0159i odes\u00edl\u00e1n\u00ed dotazu. Podle n\u011bj budeme schopni ur\u010dit, kter\u00e1 odpov\u011b\u010f k n\u00e1m p\u0159i\u0161la.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>Pro pub-sub je to o n\u011bco jednodu\u0161\u0161\u00ed. M\u00e1me bod v\u00fdm\u011bny, na kter\u00fd se publikuj\u00ed zpr\u00e1vy. Bod v\u00fdm\u011bny rozd\u011bluje zpr\u00e1vy mezi odb\u011brateli, kte\u0159\u00ed se p\u0159ihl\u00e1sili k odpov\u00eddaj\u00edc\u00edm kl\u00ed\u010d\u016fm pro sm\u011brov\u00e1n\u00ed (d\u00e1 se \u0159\u00edci, \u017ee je to analog t\u00e9mat).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">\u0160k\u00e1lovatelnost a odolnost proti chyb\u00e1m<\/h2>\n<p><\/p>\n<p>\u0160k\u00e1lovatelnost cel\u00e9ho syst\u00e9mu z\u00e1vis\u00ed na m\u00ed\u0159e \u0161k\u00e1lovatelnosti vrstev a komponent syst\u00e9mu:<\/p>\n<p><\/p>\n<ul>\n<li>Slu\u017eby se \u0161k\u00e1luj\u00ed p\u0159id\u00e1n\u00edm dal\u0161\u00edch uzl\u016f s obsluhou t\u00e9to slu\u017eby do clusteru. B\u011bhem zku\u0161ebn\u00edho provozu lze vybrat optim\u00e1ln\u00ed strategii vyva\u017eov\u00e1n\u00ed.<\/li>\n<li>Samotn\u00e1 slu\u017eba messaging v r\u00e1mci samostatn\u00e9ho clusteru se obvykle \u0161k\u00e1luje bu\u010f p\u0159esunut\u00edm zvl\u00e1\u0161\u0165 zat\u00ed\u017een\u00fdch v\u00fdm\u011bnn\u00fdch bod\u016f na samostatn\u00e9 uzly clusteru, nebo p\u0159id\u00e1n\u00edm proces\u016f proxy do zvl\u00e1\u0161\u0165 zat\u00ed\u017een\u00fdch oblast\u00ed clusteru.<\/li>\n<li>\u0160k\u00e1lovatelnost cel\u00e9ho syst\u00e9mu jako charakteristika z\u00e1vis\u00ed na flexibilit\u011b architektury a mo\u017enosti spojen\u00ed jednotliv\u00fdch cluster\u016f do spole\u010dn\u00e9 logick\u00e9 entity.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u00dasp\u011b\u0161nost projektu \u010dasto z\u00e1vis\u00ed na jednoduchosti a rychlosti \u0161k\u00e1lov\u00e1n\u00ed. Messaging v aktu\u00e1ln\u00edm proveden\u00ed roste spolu s aplikac\u00ed. I kdy\u017e n\u00e1m chyb\u00ed cluster o 50-60 stroj\u00edch, m\u016f\u017eeme vyu\u017e\u00edt federaci. Bohu\u017eel, t\u00e9ma federace p\u0159esahuje r\u00e1mec tohoto \u010dl\u00e1nku.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Z\u00e1lohov\u00e1n\u00ed<\/h2>\n<p><\/p>\n<p>P\u0159i rozboru vyva\u017eov\u00e1n\u00ed z\u00e1t\u011b\u017ee jsme ji\u017e diskutovali o z\u00e1lohov\u00e1n\u00ed \u0159\u00eddic\u00edch prvk\u016f slu\u017eeb. Av\u0161ak messaging tak\u00e9 mus\u00ed b\u00fdt z\u00e1lohov\u00e1n. V p\u0159\u00edpad\u011b selh\u00e1n\u00ed uzlu nebo stroje se messaging mus\u00ed automaticky obnovit, a to v co nejkrat\u0161\u00edm \u010dase.<\/p>\n<p><\/p>\n<p>Ve sv\u00fdch projektech pou\u017e\u00edv\u00e1m dal\u0161\u00ed uzly, kter\u00e9 p\u0159eb\u00edraj\u00ed z\u00e1t\u011b\u017e v p\u0159\u00edpad\u011b selh\u00e1n\u00ed. V Erlangu existuje standardn\u00ed implementace distribuovan\u00e9ho re\u017eimu pro aplikace OTP. Distribuovan\u00fd re\u017eim pr\u00e1v\u011b zaji\u0161\u0165uje obnovu v p\u0159\u00edpad\u011b selh\u00e1n\u00ed t\u00edm, \u017ee spust\u00ed havarovanou aplikaci na jin\u00e9m p\u0159edem spu\u0161t\u011bn\u00e9m uzlu. Proces je pr\u016fhledn\u00fd, po selh\u00e1n\u00ed se aplikace automaticky p\u0159esune na failover uzel. O tomto funkcionalit\u011b se m\u016f\u017eete dozv\u011bd\u011bt v\u00edce. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">tady<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">V\u00fdkon<\/h2>\n<p><\/p>\n<p>Zkus\u00edme alespo\u0148 p\u0159ibli\u017en\u011b porovnat v\u00fdkon rabbitmq a na\u0161eho vlastn\u00edho messagingu.<br \/>\nNa\u0161el jsem <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">ofici\u00e1ln\u00ed v\u00fdsledky<\/a><\/noindex> testov\u00e1n\u00ed rabbitmq od t\u00fdmu openstack.<\/p>\n<p><\/p>\n<p>V bod\u011b 6.14.1.2.1.2.2 origin\u00e1ln\u00edho dokumentu je uveden v\u00fdsledek RPC CAST:<br \/>\n<img decoding=\"async\" alt=\"Stavebn\u00ed bloky distribuovan\u00fdch aplikac\u00ed. Druh\u00e9 p\u0159ibl\u00ed\u017een\u00ed\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u0159edem nebudeme prov\u00e1d\u011bt \u017e\u00e1dn\u00e9 dal\u0161\u00ed nastaven\u00ed v j\u00e1d\u0159e OS nebo erlang VM. Podm\u00ednky pro testov\u00e1n\u00ed:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Test v r\u00e1mci jednoho uzlu erlang b\u011b\u017e\u00ed na notebooku se star\u00fdm i7 v mobiln\u00edm proveden\u00ed.<\/li>\n<li>Clusterov\u00e9 testy prob\u00edhaj\u00ed na serverech s 10G s\u00edt\u00ed.<\/li>\n<li>K\u00f3d b\u011b\u017e\u00ed v docker kontejnerech. S\u00ed\u0165 v re\u017eimu 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>Sc\u00e9n\u00e1\u0159 1:<\/em> Test se spou\u0161t\u00ed na notebooku se star\u0161\u00edm mobiln\u00edm i7 procesorem. Test, messaging a slu\u017eba b\u011b\u017e\u00ed na jednom uzlu v jednom docker kontejneru:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sekven\u010dn\u00ed 10000 cykl\u016f za ~0 sekund (26987 cykl\u016f\/s)\nSekven\u010dn\u00ed 20000 cykl\u016f za ~1 sekundu (26915 cykl\u016f\/s)\nSekven\u010dn\u00ed 100000 cykl\u016f za ~4 sekundy (26957 cykl\u016f\/s)\nParaleln\u00ed 2 100000 cykl\u016f za ~2 sekundy (44240 cykl\u016f\/s)\nParaleln\u00ed 4 100000 cykl\u016f za ~2 sekundy (53459 cykl\u016f\/s)\nParaleln\u00ed 10 100000 cykl\u016f za ~2 sekundy (52283 cykl\u016f\/s)\nParaleln\u00ed 100 100000 cykl\u016f za ~3 sekundy (49317 cykl\u016f\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Sc\u00e9n\u00e1\u0159 2<\/em>: 3 uzly spu\u0161t\u011bn\u00e9 na r\u016fzn\u00fdch stroj\u00edch pod dockerem (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sekven\u010dn\u00ed 10000 cykl\u016f za ~1 sekundu (8684 cykl\u016f\/s)\nSekven\u010dn\u00ed 20000 cykl\u016f za ~2 sekundy (8424 cykl\u016f\/s)\nSekven\u010dn\u00ed 100000 cykl\u016f za ~12 sekund (8655 cykl\u016f\/s)\nParaleln\u00ed 2 100000 cykl\u016f za ~7 sekund (15160 cykl\u016f\/s)\nParaleln\u00ed 4 100000 cykl\u016f za ~5 sekund (19133 cykl\u016f\/s)\nParaleln\u00ed 10 100000 cykl\u016f za ~4 sekundy (24399 cykl\u016f\/s)\nParaleln\u00ed 100 100000 cykl\u016f za ~3 sekundy (34517 cykl\u016f\/s)<\/code><\/pre>\n<p><\/p>\n<p>V\u0161echny p\u0159\u00edpady CPU nevyu\u017eily v\u00edce ne\u017e 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Z\u00e1v\u011bry<\/h2>\n<p><\/p>\n<p>Douf\u00e1m, \u017ee tento cyklus nevypad\u00e1 jako dumping my\u0161lenek a \u017ee moje zku\u0161enosti skute\u010dn\u011b p\u0159inesou u\u017eitek jak v\u00fdzkumn\u00edk\u016fm distribuovan\u00fdch syst\u00e9m\u016f, tak praktik\u016fm, kte\u0159\u00ed jsou na za\u010d\u00e1tku cesty budov\u00e1n\u00ed distribuovan\u00fdch architektur pro sv\u00e9 obchodn\u00ed syst\u00e9my a s z\u00e1jmem se d\u00edvaj\u00ed na Erlang\/Elixir, ale v\u00e1haj\u00ed, zda 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\">Pouze registrovan\u00ed u\u017eivatel\u00e9 se mohou \u00fa\u010dastnit ankety. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">P\u0159ihlaste se<\/a><\/noindex>, pros\u00edm.<\/p>\n<h2 class=\"default-block__polling-title\">Jak\u00e1 t\u00e9mata bych m\u011bl podrobn\u011bji rozv\u00e9st 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>                    Teorie: Trhy, objedn\u00e1vky a doby jejich platnosti: 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\u00e1vek. Teorie a praxe realizace knihy s seskupen\u00edm<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Vizualizace obchodov\u00e1n\u00ed: Tickery, sv\u00ed\u010dky, \u010dasov\u00e9 rozli\u0161en\u00ed. Jak ukl\u00e1dat a jak spojovat<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Backoffice. Pl\u00e1nov\u00e1n\u00ed a v\u00fdvoj. Kontrola zam\u011bstnanc\u016f a vy\u0161et\u0159ov\u00e1n\u00ed incident\u016f<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Zjist\u00edme, jak\u00e9 rozhran\u00ed pot\u0159ebujeme a jak je realizovat<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Ukl\u00e1d\u00e1n\u00ed informac\u00ed: PostgreSQL, Timescale, Tarantool v obchodn\u00edch syst\u00e9mech<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reaktivita v obchodn\u00edch syst\u00e9mech<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Jin\u00e9. Nap\u00ed\u0161u v koment\u00e1\u0159\u00edch<\/p>\n<\/li>\n<\/ul>\n<p>    Hlasovalo 6 u\u017eivatel\u016f. Zdr\u017eeli se 4 u\u017eivatel\u00e9.<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\/cs\/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=\"cs_CZ\" \/>\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\/cs\/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\u00ed bloky distribuovan\u00fdch aplikac\u00ed. Druh\u00e9 p\u0159ibl\u00ed\u017een\u00ed | ProHoster","description":"Ozn\u00e1men\u00ed Kolegov\u00e9, v polovin\u011b l\u00e9ta pl\u00e1nuji vydat dal\u0161\u00ed cyklus \u010dl\u00e1nk\u016f o n\u00e1vrhu syst\u00e9m\u016f pro hromadn\u00fd servis: \"Experiment VTrade\" \u2013 pokus o naps\u00e1n\u00ed frameworku pro obchodov\u00e1n\u00ed.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/31124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}