{"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\/et\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"Jaotatud rakenduste ehitusplokid. Teine l\u00e4henemine","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Teade<\/strong><\/p>\n<p><\/p>\n<p><em>Kollegid, suve keskpaiku plaanin avaldada veel \u00fche artiklite seeria massiteenuse s\u00fcsteemide projekteerimise kohta: \"Eksperiment VTrade\" \u2014 katse kirjutada raamistiku kauplemiss\u00fcsteemide jaoks. Seerias k\u00e4sitletakse b\u00f6rsi, oksjoni ja poe loomise teooriat ja praktikat. Artikli l\u00f5pus kutsub autor \u00fcles h\u00e4\u00e4letama k\u00f5ige huvitavamate teemade \u00fcle.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Jaotatud rakenduste ehitusplokid. Teine l\u00e4henemine\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>See on viimane artikkel jaotise kohta jaotatud reaktiivsetest rakendustest Erlangu\/Elixiriga. S <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">esimesest artiklist<\/a><\/noindex> v\u00f5ib leida reaktiivse arhitektuuri teoreetilised alused. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Teine artikkel<\/a><\/noindex> illustreerib peamisi mustreid ja mehhanisme selliste s\u00fcsteemide loomisel.<\/p>\n<p><\/p>\n<p>T\u00e4na k\u00e4sitleme koodibaasi ja projektide arengut \u00fcldiselt. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Teenuste korraldamine<\/h2>\n<p><\/p>\n<p>Reaalses elus teenuse arendamisel tuleb sageli \u00fchendada mitu suhtlemismustrit \u00fches kontrolleris. N\u00e4iteks teenus users, mis lahendab projekti kasutajaprofiilide haldamise \u00fclesandeid, peab vastama p\u00e4ringutele req-resp ja teatama profiilide uuendustest pub-sub kaudu. See juhtum on \u00fcsna lihtne: jagamise taga on \u00fcks kontroller, mis rakendab teenuse loogikat ja avaldab uuendusi.<\/p>\n<p><\/p>\n<p>Situatsioon muutub keerulisemaks, kui peame rakendama t\u00f5rkevaru jaotatud teenust. Oletame, et kasutajate n\u00f5udmised on muutunud: <\/p>\n<p><\/p>\n<ol>\n<li>n\u00fc\u00fcd peab teenus t\u00f6\u00f6tlema p\u00e4ringuid 5 klastris\u00f5lmes, <\/li>\n<li>olema v\u00f5imeline t\u00e4itma taustat\u00f6\u00f6tlus\u00fclesandeid, <\/li>\n<li>ja suutma d\u00fcnaamiliselt hallata tellimuste loode profiili v\u00e4rskendustele.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>M\u00e4rkus:<\/em> Andmete j\u00e4rjepideva salvestamise ja kopeerimise k\u00fcsimust me ei aruta. Eeldame, et need k\u00fcsimused on varem lahendatud ja s\u00fcsteemis on juba olemas usaldusv\u00e4\u00e4rne ning skaleeritav salvestuskiht, millel on t\u00f6\u00f6tlejatel suhtlemismehhanismid.<\/p>\n<p><\/p>\n<p>Kasutajate teenuse formaalne kirjeldus on muutunud keerulisemaks. Programmi seisukohalt on t\u00e4nu s\u00f5numside kasutamisele muudatused minimaalsed. Esimese n\u00f5ude t\u00e4itmiseks peame seadistama tasakaalustamise req-resp vahetuspunktis. <\/p>\n<p><\/p>\n<p>Taustat\u00f6\u00f6de t\u00f6\u00f6tlemise n\u00f5udmine tekib sageli. Users'is v\u00f5ivad need olla kasutajate dokumentide kontrollimine, \u00fcles laaditud multimeedia t\u00f6\u00f6tlemine v\u00f5i andmete s\u00fcnkroonimine sotsiaalsete v\u00f5rgustikega. Need \u00fclesanded tuleb mingil viisil jaotada klastris ja nende t\u00e4itmise kulgu j\u00e4lgida. Seet\u00f5ttu on meil kaks lahenduse varianti: kas kasutada eelmise artikli \u00fclesannete jaotamise \u0448\u0430\u0431\u043b\u043e\u043d\u0438 v\u00f5i, kui see ei sobi, kirjutada kohandatud \u00fclesannete planeerija, mis hallataks meie vajaduste j\u00e4rgi. <\/p>\n<p><\/p>\n<p>3. punkt n\u00f5uab pub-sub \u0448\u0430\u0431\u043b\u043e\u043d\u0438 laiendamist. Ja selle teostamiseks, p\u00e4rast pub-sub vahetuspunkti loomist, peame k\u00e4ivitama ka selle punkti kontrolleri meie teenuse raames. Seega, nagu me viiksime tellimise ja loobumise t\u00f6\u00f6tlemise loogika messaging kihist v\u00e4lja users'i rakendusse.<\/p>\n<p><\/p>\n<p>Kokkuv\u00f5ttes n\u00e4itas \u00fclesande dekompositsioon, et n\u00f5uete rahuldamiseks peame k\u00e4ivitama 5 teenuse eksemplari erinevates s\u00f5lmedes ja looma t\u00e4iendava \u00fcksuse \u2013 pub-sub kontrolleri, mis vastutab tellimise eest.<br \/>\n5 t\u00f6\u00f6tleja k\u00e4ivitamiseks ei ole teenuse koodi vaja muuta. Ainus lisategevus on tasakaalustamisreeglite seadistamine vahetuspunktis, millest r\u00e4\u00e4gime hiljem.<br \/>\nLisaks on tekkinud t\u00e4iendav keerukus: pub-sub juht ja kohandatud \u00fclesannete ajastaja peavad t\u00f6\u00f6tama ainsas eksemplaris. J\u00e4llegi, messaging teenus, olles alus, peab pakkuma juhtimismehhanismi.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Juhi valik<\/h3>\n<p><\/p>\n<p>Jaotatud s\u00fcsteemides on juhi valik \u2013 menetlus, mille k\u00e4igus m\u00e4\u00e4ratakse ainus protsess, mis vastutab jaotatud koormuse t\u00f6\u00f6tlemise planeerimise eest. <\/p>\n<p><\/p>\n<p>S\u00fcsteemides, mis ei kaldu keskendumisele, kasutatakse universaalseid algoritme ja konsensusel p\u00f5hinevaid algoritme, n\u00e4iteks paxos v\u00f5i raft.<br \/>\nKuna messaging on vahendaja ja keskne element, siis teab ta k\u00f5igist teenuse kontrollijatest - juhtide kandidaatidest. Messaging v\u00f5ib m\u00e4\u00e4rata juhi ilma h\u00e4\u00e4letamiseta.<\/p>\n<p><\/p>\n<p>K\u00f5ik teenused saavad p\u00e4rast k\u00e4ivitamist ja \u00fchendamist vahetuspunktiga s\u00fcsteemiteate <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. Kui <code>LeaderPid<\/code> on sama kui <code>pid<\/code> praeguse protsessi puhul, m\u00e4\u00e4ratakse ta juhiks ja nimekiri <code>Servers<\/code> k\u00e4tkeb endas k\u00f5iki s\u00f5lme ja nende parameetreid.<br \/>\nKui klastris tekib uus s\u00f5lm ja varasem s\u00f5lm l\u00fclitatakse v\u00e4lja, saavad k\u00f5ik teenuse kontrollerid <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> ja <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> vastavalt.<\/p>\n<p><\/p>\n<p>Seega teavad k\u00f5ik komponendid k\u00f5igist muudatustest ning klastris on igal hetkel tagatud \u00fcks juht.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Vahekohtunikud<\/h2>\n<p><\/p>\n<p>Kompaktsede hajutatud t\u00f6\u00f6tlemisprotsesside rakendamiseks ning juba olemasoleva arhitektuuri optimeerimise probleemide lahendamiseks on mugav kasutada vahekohtunikke.<br \/>\nKuna teenuste koodi ei soovi muuta ja lahendada n\u00e4iteks t\u00e4iendava t\u00f6\u00f6tlemise, marsruutimise v\u00f5i s\u00f5numite logimise \u00fclesandeid, v\u00f5ib teenuse ette lisada proxy t\u00f6\u00f6tlija, mis t\u00e4idab kogu t\u00e4iendava t\u00f6\u00f6.<\/p>\n<p><\/p>\n<p>Klassikaline n\u00e4ide pub-sub optimeerimise kohta on hajutatud rakendus, millel on \u00e4ri- s\u00fcda, mis genereerib uuenduste s\u00fcndmusi, n\u00e4iteks hinnamuutuse turul, ja juurdep\u00e4\u00e4su kiht \u2014 N serverit, mis pakuvad websocket API-d veebiklientidele.<br \/>\nKui l\u00e4heneda probleemile otse, n\u00e4eb kliendi teenindamine v\u00e4lja j\u00e4rgmiselt:<\/p>\n<p><\/p>\n<ul>\n<li>kliendil on \u00fchendus platvormiga. Serveripoolel, mis l\u00f5petab liikluse, algab protsessi k\u00e4ivitamine, mis teenindab seda \u00fchendust.<\/li>\n<li>teenuse protsessis toimub autentimine ja tellimine uuenduste jaoks. Protsess kutsub esile subscribe meetodi teemadele.<\/li>\n<li>p\u00e4rast s\u00fcndmuse genereerimist s\u00fcdamikus toimetatakse see protsessidele, mis haldavad \u00fchendusi.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kujutame ette, et meil on 50000 tellijat teemale \"uudised\". Tellijad on jaotatud 5 serveri vahel \u00fchtlaselt. Seega iga uuendus, j\u00f5udnud vahetuspunkti, replitseeritakse 50000 korda: 10000 korda igas serveris, vastavalt tellijate arvule seal. Mitte k\u00f5ige efektiivsem skeem, kas pole?<br \/>\nEt olukorda parandada, tutvustame proxy't, millel on sama nimi nagu vahetuspunktil. Globaalse nimede registrator peab olema v\u00f5imeline nime alusel tagastama l\u00e4hima protsessi, see on oluline.<\/p>\n<p><\/p>\n<p>K\u00e4ivitame selle proxy serverites juurdep\u00e4\u00e4su kihis, ja k\u00f5ik meie protsessid, mis haldavad websocket api, tellivad selle, mitte algse pub-sub vahetuspunkti s\u00fcdamikus. Proxy tellib s\u00fcdamikust ainult unikaalse tellimise korral ja replitseerib saabunud s\u00f5numi k\u00f5ikidele oma tellijatele.<br \/>\nSeega edastatakse s\u00fcdamiku ja juurdep\u00e4\u00e4su serverite vahel 5 s\u00f5numit, mitte 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Marsruutimine ja tasakaalustamine<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>Praeguses messaging'i rakenduses on 7 p\u00e4ringute jaotamise strateegiat:<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. P\u00e4ring edastatakse k\u00f5ikidele kontrolleritele.<\/li>\n<li><code>ring-levi<\/code>. Teostatakse iteratsioon ja ts\u00fckliline p\u00e4ringute jaotamine kontrollerite vahel.<\/li>\n<li><code>konsensus<\/code>. Teenust pakkuvad kontrollerid jagunevad liidriks ja j\u00e4rgnejateks. P\u00e4ringud edastatakse ainult liidrile.<\/li>\n<li><code>konsensus &amp; ring-levi<\/code>. Grupis on liider, kuid p\u00e4ringud jaotatakse k\u00f5igi liikmete vahel.<\/li>\n<li><code>kleepuv<\/code>. Arvutatakse hash-funktsioon ja seotakse teatud t\u00f6\u00f6tlejaga. J\u00e4rgnevad p\u00e4ringud selle signatuuriga j\u00f5uavad samale t\u00f6\u00f6tlejale.<\/li>\n<li><code>kleepuv-funktsioon<\/code>. Vahetuspunkti algatamisel edastatakse lisaks hash-funktsiooni arvutamise funktsioon. <code>kleepuv<\/code> jaotamiseks.<\/li>\n<li><code>l\u00f5bu.<\/code>. Sarnane kleepuva funktsiooniga, ainult et lisaks on v\u00f5imalik suunata, tagasi l\u00fckata v\u00f5i eelt\u00f6\u00f6tleda seda. <\/li>\n<\/ul>\n<p><\/p>\n<p>Jaotamisstrateegia m\u00e4\u00e4ratakse vahetuspunkti algatamisel.<\/p>\n<p><\/p>\n<p>Lisaks jaotamisele v\u00f5imaldab messaging t\u00e4histada \u00fcksusi. Vaatleme s\u00fcsteemi erinevaid t\u00e4hiseid:<\/p>\n<p><\/p>\n<ul>\n<li>\u00dchenduse silt. See aitab m\u00f5ista, millise \u00fchenduse kaudu s\u00fcndmused p\u00e4rit on. Seda kasutatakse siis, kui kontrolleri protsess on \u00fchendatud \u00fche vahetuspunktiga, kuid erinevate marsruutimisv\u00f5tmetega. <\/li>\n<li>Teenuse silt. See v\u00f5imaldab \u00fchel teenusel grupeerida t\u00f6\u00f6tlejad ja laiendada marsruutimise ning koormuse jaotamise v\u00f5imalusi. Req-resp mustri korral on marsruutimine lineaarne. Saadame p\u00e4ringu vahetuspunkti, mis edasi edastab selle teenusele. Kuid kui peame t\u00f6\u00f6tlejad loogilisteks gruppideks jagama, siis toimub jagamine siltide abil. Sildi m\u00e4\u00e4ramisel suunatakse p\u00e4ring konkreetse kontrollerite gruppi.<\/li>\n<li>P\u00e4ringu silt. See v\u00f5imaldab eristada vastuseid. Kuna meie s\u00fcsteem on as\u00fcnkroonne, peab teenuse vastuste t\u00f6\u00f6tlemiseks olema v\u00f5imalik m\u00e4\u00e4rata RequestTag p\u00e4ringu saatmisel. Selle p\u00f5hjal saame m\u00f5ista, millise p\u00e4ringu vastus meile saabus.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>Pub-sub puhul on k\u00f5ik natuke lihtsam. Meil on vahetuspunkt, kuhu avaldatakse s\u00f5numeid. Vahetuspunkt jagab s\u00f5numeid tellijate vahel, kes on tellinud vajalikud marsruutimisv\u00f5tmed (v\u00f5ib \u00f6elda, et see on analoog teemale).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">Skaalautuvus ja t\u00f6\u00f6kindlus<\/h2>\n<p><\/p>\n<p>S\u00fcsteemi \u00fcldine skaala s\u00f5ltub s\u00fcsteemi kihtide ja komponentide skaalaastmest:<\/p>\n<p><\/p>\n<ul>\n<li>Teenused skaleeritakse lisades klastrisse t\u00e4iendavaid s\u00f5lmi, millel on selle teenuse t\u00f6\u00f6tlejad. Protsessi k\u00e4igus saab optimaalset koormuse tasakaalustamise poliitikat valida katse ajal.<\/li>\n<li>Kuna teenus messaging \u00fches klastris skaleerub, siis tavaliselt kas koormatud vahetuspunktid viiakse eraldi s\u00f5lmedesse v\u00f5i lisatakse proxy protsesse k\u00f5rgelt koormatud klastritsoonidesse.<\/li>\n<li>Kogu s\u00fcsteemi skaleeritavus s\u00f5ltub arhitektuuri paindlikkusest ja eraldi klastrite \u00fchendamise v\u00f5imest \u00fcldiseks loogiliseks \u00fcksuseks.<\/li>\n<\/ul>\n<p><\/p>\n<p>Projektide edu s\u00f5ltub sageli skaala lihtsusest ja kiirusest. Messaging praeguses vormis kasvab koos rakendusega. Isegi kui meil puudub 50-60 masinat sisaldav klaster, saame kasutada f\u00f6deratsiooni. Kahjuks \u00fcletab f\u00f6deratsiooni teema selle artikli raamid.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Varu<\/h2>\n<p><\/p>\n<p>Laadija koormuse jaotuse k\u00e4igus arutasime juba teenusekontrollerite varundamist. Kuid ka s\u00f5numiteed tuleb varundada. Kui s\u00f5lm v\u00f5i masin l\u00e4bi kukkub, peab s\u00f5numiteede taastamine toimuma automaatselt ja v\u00f5imalikult kiiresti.<\/p>\n<p><\/p>\n<p>Oma projektides kasutan t\u00e4iendavaid s\u00f5lmi, mis v\u00f5tavad koormuse \u00fcle, kui midagi kukub. Erlangis on olemas standardne rakendus jaotatud re\u017eiimis OTP rakenduste jaoks. Jaotatud re\u017eiim teostab just selle rikkumise taastamise, k\u00e4ivitades kukkunud rakenduse teisel eelnevalt k\u00e4ivitatud s\u00f5lmel. Protsess on l\u00e4bipaistev, p\u00e4rast rikkumist liigub rakendus automaatselt varukoopiale. T\u00e4psemalt selle funktsionaalsuse kohta lugemiseks v\u00f5ite vaadata <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">siin<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">Tootlikkus<\/h2>\n<p><\/p>\n<p>Proovime v\u00e4hemalt ligikaudselt v\u00f5rrelda rabbitmq ja meie kohandatud s\u00f5numiteed.<br \/>\nLeidsin <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">ametlikud tulemused<\/a><\/noindex> rabbitmq testimisest openstacki meeskonna poolt.<\/p>\n<p><\/p>\n<p>Algse dokumendi punktis 6.14.1.2.1.2.2 on esitatud RPC CAST: tulemused.<br \/>\n<img decoding=\"async\" alt=\"Jaotatud rakenduste ehitusplokid. Teine l\u00e4henemine\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eeltingimusi, et operatiiv s\u00fcsteemi v\u00f5i erlangi VM-i ei muuda. Testimise tingimused:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Erlang'i test k\u00e4ivitub vanal i7 mobiilse seadmena s\u00fclearvutis.<\/li>\n<li>Klastri testid toimuvad 10G v\u00f5rgu serverites.<\/li>\n<li>Kood t\u00f6\u00f6tab Docker konteinerites. V\u00f5rk on NAT-re\u017eiimis.<\/li>\n<\/ul>\n<p><\/p>\n<p>Testikood:<\/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>Skenaario 1:<\/em> Test k\u00e4ivitub s\u00fclearvutis vanal i7 mobiilse seadmena. Test, messaging ja teenus toimuvad \u00fchel s\u00f5lmel \u00fches Docker konteineris:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">J\u00e4rjestikused 10000 ts\u00fcklit ~0 sekundiga (26987 ts\u00fcklit\/s)\nJ\u00e4rjestikused 20000 ts\u00fcklit ~1 sekundiga (26915 ts\u00fcklit\/s)\nJ\u00e4rjestikused 100000 ts\u00fcklit ~4 sekundiga (26957 ts\u00fcklit\/s)\nParallel 2 100000 ts\u00fcklit ~2 sekundiga (44240 ts\u00fcklit\/s)\nParallel 4 100000 ts\u00fcklit ~2 sekundiga (53459 ts\u00fcklit\/s)\nParallel 10 100000 ts\u00fcklit ~2 sekundiga (52283 ts\u00fcklit\/s)\nParallel 100 100000 ts\u00fcklit ~3 sekundiga (49317 ts\u00fcklit\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Skeem 2<\/em>: 3 s\u00f5lme, mis on k\u00e4ivitunud erinevates masinates Docker'i all (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">J\u00e4rjestikused 10000 ts\u00fcklit ~1 sekundiga (8684 ts\u00fcklit\/s)\nJ\u00e4rjestikused 20000 ts\u00fcklit ~2 sekundiga (8424 ts\u00fcklit\/s)\nJ\u00e4rjestikused 100000 ts\u00fcklit ~12 sekundiga (8655 ts\u00fcklit\/s)\nParallel 2 100000 ts\u00fcklit ~7 sekundiga (15160 ts\u00fcklit\/s)\nParallel 4 100000 ts\u00fcklit ~5 sekundiga (19133 ts\u00fcklit\/s)\nParallel 10 100000 ts\u00fcklit ~4 sekundiga (24399 ts\u00fcklit\/s)\nParallel 100 100000 ts\u00fcklit ~3 sekundiga (34517 ts\u00fcklit\/s)<\/code><\/pre>\n<p><\/p>\n<p>K\u00f5igil juhtudel ei \u00fcletanud CPU kasutamine 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Kokkuv\u00f5te<\/h2>\n<p><\/p>\n<p>Loodan, et see ts\u00fckkel ei tundu nagu teadvuse dump ning minu kogemus toob reaalse kasu nii jaotatud s\u00fcsteemide uurijatele kui ka praktikutele, kes on jaotatud arhitektuuride loomise teekonna alguses oma \u00e4ris\u00fcsteemide jaoks ja vaatavad huviga Erlang\/Elixir'i, kuid kahtlevad, kas see on v\u00e4\u00e4rt...<\/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\">Ainult registreeritud kasutajad saavad k\u00fcsitluses osaleda. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logige sisse<\/a><\/noindex>, palun.<\/p>\n<h2 class=\"default-block__polling-title\">Milliseid teemasid peaksin p\u00f5hjalikumalt k\u00e4sitlema ts\u00fckli \"Eksperiment VTrade\" raames?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Teooria: Turud, orderid ja nende kehtivus: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Orderite raamat. Teooria ja praktika raamatute rakendamisest grupiga<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Kaubanduse visualiseerimine: tiketid, baarid, resolutsioonid. Kuidas salvestada ja kleebendada<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tagakorter. Planeerimine ja arendus. T\u00f6\u00f6tajate kontroll ja intsidentide uurimine<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Selgitame v\u00e4lja, millised liidesed on vajalikud ja kuidas neid rakendada<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Teabe salvestamine: PostgreSQL, Timescale, Tarantool kaubanduss\u00fcsteemides<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reaktiivsus kaubanduss\u00fcsteemides<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Muu. Kirjutan kommentaaridesse<\/p>\n<\/li>\n<\/ul>\n<p>    H\u00e4\u00e4letas 6 kasutajat. 4 kasutajat hoidusid.<br \/>\n<br \/>Allikas: <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 4.9.10 - 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 \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\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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 \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Jaotatud rakenduste ehitusplokid. Teine l\u00e4henemine | ProHoster","description":"Kallis, suve keskpaiku plaanin avaldada veel \u00fche artiklite ts\u00fckli massiliste teeninduss\u00fcsteemide projekteerimise kohta: \u201eEksperiment VTrade\u201c \u2014 katse kirjutada raamistik kauplemiss\u00fcsteemide jaoks. Ts\u00fcklis k\u00e4sitletakse b\u00f6rside, oksjonite ja poodide loomise teooriat ja praktikat. Artikli l\u00f5pus kutsun teid \u00fcles h\u00e4\u00e4letama k\u00f5ige huvitavamaid teemasid. See on l\u00f5petav artikkel jaotatud reaktiivsest.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\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 \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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}