{"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>Kolleegid, suve keskel plaanin v\u00e4lja anda veel \u00fche artiklite seeria massiliste teeninduss\u00fcsteemide projekteerimisest: \"Eksperimendi VTrade\" \u2014 katse kirjutada kaubanduss\u00fcsteemide raamistik. Seerias k\u00e4sitletakse b\u00f6rsi, oksjoni ja poe loomise teooriat ja praktikat. Artikli l\u00f5pus kutsun teid h\u00e4\u00e4letama k\u00f5ige enam huvitavate 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 jaotises jaotatud reaktiivsetest rakendustest Erlangis\/Elixiris. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">esimene artikkel<\/a><\/noindex> leiab teoreetilised alused reaktiivse arhitektuuri jaoks. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Teine artikkel<\/a><\/noindex> illustreerib peamisi mudeleid ja mehhanisme sarnaste s\u00fcsteemide loomisel.<\/p>\n<p><\/p>\n<p>T\u00e4na k\u00e4sitleme koodibaasi ja projektide arengu k\u00fcsimusi. <\/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>Tegelikkuses teenuse arendamisel tuleb sageli \u00fchendada mitu suhtlemismudelit \u00fches kontrolleris. N\u00e4iteks teenus users, mis lahendab projekti kasutajaprofiilide juhtimise \u00fclesandeid, peab vastama req-resp p\u00e4ringutele ja edastama profiilide uuendustest teateid pub-sub kaudu. See juhtum on \u00fcsna lihtne: s\u00f5numite saatmise taga on \u00fcks kontroller, mis rakendab teenuse loogikat ja avaldab uuendusi.<\/p>\n<p><\/p>\n<p>Olukord muutub keerulisemaks, kui peame rakendama t\u00f5rketaluvust jagatud teenusele. Kujutame ette, et n\u00f5uded users teenusele on muutunud: <\/p>\n<p><\/p>\n<ol>\n<li>n\u00fc\u00fcd peab teenus t\u00f6\u00f6tlema p\u00e4ringuid 5 klastrite s\u00f5lmes, <\/li>\n<li>olema v\u00f5imeline t\u00e4itma taustatehnoloogia \u00fclesandeid, <\/li>\n<li>samuti suutma d\u00fcnaamiliselt hallata profiilide uuendustele registreerimise nimekirju.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>M\u00e4rkus:<\/em> Me ei k\u00e4sitle andmete j\u00e4rjepideva s\u00e4ilitamise ja replikeerimise k\u00fcsimusi. Eeldame, et need k\u00fcsimused on varem lahendatud ja s\u00fcsteemis on juba usaldusv\u00e4\u00e4rne ja skaleeritav salvestuskiht ning t\u00f6\u00f6tlejatel on selleks suhtlemismehhanismid.<\/p>\n<p><\/p>\n<p>Teenuse users formaalne kirjeldus on keerulisemaks muutunud. Programmeerija seisukohalt, t\u00e4nu s\u00f5numite saatmise kasutamisele, on muudatused minimaalsed. Esimese n\u00f5ude rahuldamiseks peame seadistama koormuse jaotamise req-resp vahetuspunktis. <\/p>\n<p><\/p>\n<p>Taustat\u00f6\u00f6tluse n\u00f5ue esineb sageli. Users'is v\u00f5ivad need olla kasutajate dokumentide kontroll, \u00fcles laaditud multimeedia t\u00f6\u00f6tlemine v\u00f5i andmete s\u00fcnkroonimine sotsiaalmeediaga. Need \u00fclesanded tuleb jagada clustreis ja nende t\u00e4itmist kontrollida. Seet\u00f5ttu on meil kaks lahenduste varianti: kas kasutada \u00fclesannete jaotamise mallist eelnevas artiklis v\u00f5i, kui see ei sobi, kirjutada kohandatud \u00fclesandeplaanija, mis haldab t\u00f6\u00f6tlejate reservi \u00f5igel viisil. <\/p>\n<p><\/p>\n<p>3. punkt n\u00f5uab pub-sub malli laiendamist. Selle rakendamiseks, p\u00e4rast pub-sub vahetuspunkti loomist, peame samuti k\u00e4ivitama selle punkti kontrolleri meie teenuse raamistikus. Nii nagu viibime, t\u00f5stame tellimise ja t\u00fchistamise t\u00f6\u00f6tlemise loogika messaging kihist v\u00e4lja users'i rakendusse.<\/p>\n<p><\/p>\n<p>Kokkuv\u00f5ttes n\u00e4itas \u00fclesande dekompositsioon, et meie n\u00f5uete rahuldamiseks peame k\u00e4ivitama erinevates s\u00f5lmedes 5 teenuse eksemplari ja looma t\u00e4iendava entiteedi \u2013 pub-sub kontrolleri, mis vastutab tellimise eest.<br \/>\n5 t\u00f6\u00f6tleja k\u00e4ivitamiseks ei ole vaja teenuse koodi muuta. Ainus t\u00e4iendav tegevus on tasakaalustamise reeglite seadistamine vahetuspunktis, millest r\u00e4\u00e4gime veidi hiljem.<br \/>\nIlmnes ka t\u00e4iendav keerukus: pub-sub kontroller ja kohandatud \u00fclesandeplaanija peavad t\u00f6\u00f6tama \u00fches eksemplaris. J\u00e4llegi, messaging teenusena peab pakkuma liidri valimise mehhanismi.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Liidri valimine<\/h3>\n<p><\/p>\n<p>Jaotatud s\u00fcsteemides on liidri valimine protseduur, mille k\u00e4igus m\u00e4\u00e4ratakse \u00fcksik protsess, mis vastutab jaotatud koormuse t\u00f6\u00f6tlemise planeerimise eest. <\/p>\n<p><\/p>\n<p>S\u00fcsteemides, mis ei kaldu keskendumise poole, rakendatakse universaalseid algoritme ja konsensusalgoritme, n\u00e4iteks paxos v\u00f5i raft.<br \/>\nKuna messaging on maakler ja keskne element, teab ta k\u00f5igist teenuse kontrollijatest \u2013 liidri kandidaatidest. Messaging saab m\u00e4\u00e4rata liidri ilma h\u00e4\u00e4letuseta.<\/p>\n<p><\/p>\n<p>K\u00f5ik teenused saavad k\u00e4ivitamise ja vahetuspunktiga \u00fchenduse loomise ajal s\u00fcsteemse s\u00f5numi <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. Juhul kui <code>LeaderPid<\/code> ka matches <code>pid<\/code> praeguse protsessi, m\u00e4\u00e4ratakse ta liidriks ja nimekiri <code>Servers<\/code> sisaldab k\u00f5iki s\u00f5lmi ja nende parameetreid.<br \/>\nUue klastris oleva s\u00f5lm ega mittet\u00f6\u00f6tav s\u00f5lm ilmumine toob kaasa selle, et k\u00f5ik teenusekontrollerid saavad <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>Nii teavad k\u00f5ik komponendid k\u00f5igist muudatustest ja klastris on igal hetkel garanteeritud \u00fcks juht.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Vahek\u00e4igud<\/h2>\n<p><\/p>\n<p>Adeptse jaotatud t\u00f6\u00f6tlemise protsesside rakendamiseks ning olemasoleva arhitektuuri optimeerimise \u00fclesannete lahendamiseks on mugav kasutada vahek\u00e4ike.<br \/>\nKoodi muutmata j\u00e4tmiseks ja n\u00e4iteks lisat\u00f6\u00f6tluse, suunamise v\u00f5i s\u00f5numite logimise k\u00fcsimuste lahendamiseks saab teenuse ette paigaldada proxy t\u00f6\u00f6tleja, mis teeb kogu lisat\u00f6\u00f6.<\/p>\n<p><\/p>\n<p>Klassikaline n\u00e4ide pub-sub optimeerimisest on jaotatud rakendus, mille \u00e4rikeskus genereerib v\u00e4rskenduse s\u00fcndmusi, n\u00e4iteks hinna muutust turul, ja juurdep\u00e4\u00e4sukiht \u2014 N serverit, mis pakuvad websocket API-d veebiklientidele.<br \/>\nKui l\u00e4heneda \u201cotseselt\u201d, n\u00e4eb kliendi teenindamine v\u00e4lja j\u00e4rgmine:<\/p>\n<p><\/p>\n<ul>\n<li>kliendil on \u00fchendus platvormiga. Serveripoolses, liiklust l\u00f5petavas osas k\u00e4ivitub protsess, mis teenindab seda \u00fchendust.<\/li>\n<li>teenindusprotsessis toimub autoriseerimine ja v\u00e4rskenduste tellimine. Protsess kutsub meetodi subscribe t\u00f6\u00f6sse.<\/li>\n<li>P\u00e4rast s\u00fcndmuse genereerimist s\u00fcdamikus toimetatakse see protsessidele, mis teenindavad \u00fchtegi \u00fchendust.<\/li>\n<\/ul>\n<p><\/p>\n<p>Kujutage ette, et meil on 50000 tellijat teemal \u201cuudised\u201d. Tellijad on jaotatud 5 serveri vahel \u00fchtlaselt. Tulemuseks on, et iga v\u00e4rskendus, j\u00f5udes vahetuspunkti, replikeeritakse 50000 korda: 10000 korda igas serveris, s\u00f5ltuvalt tellijate arvust. Mitte just k\u00f5ige t\u00f5husam skeem, eks?<br \/>\nSelle olukorra parandamiseks tutvustame proxy-d, millel on sama nimi vahetuspunktiga. Globaalsete nimede registreerija peab suutma naasta l\u00e4hima protsessiga nime j\u00e4rgi, see on oluline.<\/p>\n<p><\/p>\n<p>K\u00e4ivitatame selle proxy juurdep\u00e4\u00e4sukihtides, ja k\u00f5ik meie protsessid, mis teenindavad websocket api-d, liituvad temaga, mitte algse pub-sub vahetuspunktiga s\u00fcdamikus. Proxy liitub s\u00fcdamikuga ainult unikaalse tellimuse puhul ja replikeerib saadud s\u00f5numi k\u00f5igile oma tellijatele.<br \/>\nTulemuseks saadetakse s\u00fcdamiku ja juurdep\u00e4\u00e4siserverite vahel 5 s\u00f5numit, mitte 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Suunamine ja koormuse tasakaalustamine<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>Praeguses s\u00f5numimisrakenduses on 7 strateegiat p\u00e4ringute jaotamiseks:<\/p>\n<p><\/p>\n<ul>\n<li><code>Seej\u00e4rel k\u00e4ivitame exec k\u00e4su ja ootame 5000 sekundit, et j\u00e4tkata j\u00e4lgimist:<\/code>. P\u00e4ring edastatakse k\u00f5igile kontrolleritele.<\/li>\n<li><code>round-robin<\/code>. Teostatakse p\u00e4ringute iteratsioon ja ringjuhitav jaotamine kontrollerite vahel.<\/li>\n<li><code>konsensus<\/code>. Teenust teenindavad kontrollerid jagunevad liidriks ja j\u00e4rgijateks. P\u00e4ringud edastatakse ainult liidrile.<\/li>\n<li><code>konsensus &amp; ringjuhitav<\/code>. R\u00fchmas on liider, kuid p\u00e4ringud jaotatakse k\u00f5ikide liikmete vahel.<\/li>\n<li><code>sticky<\/code>. Arvutatakse hash-funktsioon ja kinnitatakse kindla t\u00f6\u00f6tleja k\u00fclge. J\u00e4rgmised p\u00e4ringud sama allkirjaga j\u00f5uavad sellele samale t\u00f6\u00f6tlejale.<\/li>\n<li><code>sticky-fun<\/code>. Vahetuspunkti initsialiseerimisel edastatakse t\u00e4iendavalt hash-funktsiooni arvutus <code>sticky<\/code> tasakaalustamiseks.<\/li>\n<li><code>l\u00f5bu<\/code>. Sarnane sticky-fun'ile, kuid lisaks on v\u00f5imalik suunata, tagasi l\u00fckata v\u00f5i eelnevalt t\u00f6\u00f6delda. <\/li>\n<\/ul>\n<p><\/p>\n<p>Jaotamisstrateegia m\u00e4\u00e4ratakse vahetuspunkti initsialiseerimisel.<\/p>\n<p><\/p>\n<p>Lisaks tasakaalustamisele v\u00f5imaldab s\u00f5numite vahetus etikettida entiteete. Vaatame s\u00fcsteemis etikettide t\u00fc\u00fcpe:<\/p>\n<p><\/p>\n<ul>\n<li>\u00dchenduse etikett. Aitab m\u00f5ista, millise \u00fchenduse kaudu s\u00fcndmused tulid. Kasutatakse, kui kontrolleri protsess \u00fchendub \u00fche vahetuspunktiga, kuid erinevate marsruudiv\u00f5tmetega. <\/li>\n<li>Teenuse etikett. Aitab \u00fchel teenusel r\u00fchmitada t\u00f6\u00f6tlejad ja laiendada marsruudimise ning tasakaalustamise v\u00f5imalusi. Req-resp mustris on marsruudimine lineaarne. Edastame p\u00e4ringu vahetuspunktile, sealt edastatakse see teenusele. Kuid kui peame t\u00f6\u00f6tlejad loogilisteks gruppideks jagama, toimub jagamine etikettide abil. Etiketi m\u00e4\u00e4ramisel suunatakse p\u00e4ring konkreetsele kontrollerite r\u00fchmale.<\/li>\n<li>P\u00e4ringu etikett. Aitab eristada vastuseid. Kuna meie s\u00fcsteem on as\u00fcnkroonne, siis teenuse vastuste t\u00f6\u00f6tlemiseks peab olema v\u00f5imalik m\u00e4\u00e4rata RequestTag p\u00e4ringu saatmisel. Selle j\u00e4rgi saame aru, millise p\u00e4ringu vastus meile tuli.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>Pub-sub jaoks on k\u00f5ik veidi lihtsam. Meil on vahetuspunkt, kuhu avaldatakse s\u00f5numeid. Vahetuspunkt jagab s\u00f5numid nendele tellijatele, kes on tellinud vajalikud marsruudiv\u00f5tmed (saame \u00f6elda, et see on analoog teemadele).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">M\u00f5\u00f5detavus ja t\u00f5rketaluvus<\/h2>\n<p><\/p>\n<p>S\u00fcsteemi m\u00f5\u00f5detavus s\u00f5ltub \u00fcldiselt s\u00fcsteemi tasandite ja komponentide m\u00f5\u00f5detavuse m\u00e4\u00e4rast:<\/p>\n<p><\/p>\n<ul>\n<li>Teenused skaleeruvad, lisades klastrisse t\u00e4iendavaid s\u00f5lmi, kus asuvad teenuse t\u00f6\u00f6tlejad. Eksperimenteerimise k\u00e4igus on v\u00f5imalik valida optimaalne koormuse tasakaalustamise poliitika.<\/li>\n<li>Eraldi klastris skaleerub messaging teenus \u00fcldiselt kas koormatud vahetuskohtade viimisega eraldi klastris\u00f5lmedesse v\u00f5i lisades proxy-protsesse erilise koormuse aladele.<\/li>\n<li>Kogu s\u00fcsteemi skaleeritavus kui omadus s\u00f5ltub arhitektuuri paindlikkusest ja v\u00f5imalusest \u00fchendada eraldi klastrid \u00fchiseks loogiliseks \u00fcksuseks.<\/li>\n<\/ul>\n<p><\/p>\n<p>Projekti edukus s\u00f5ltub sageli skaleerimise lihtsusest ja kiirusest. Messaging praeguses teostuses kasvab koos rakendusega. Kui meil ei piisa 50-60 masina klastrist, saame kasutada f\u00f6deratsiooni. Kahjuks j\u00e4\u00e4b f\u00f6deratsiooni teema selle artikli raamesse.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Varustamine<\/h2>\n<p><\/p>\n<p>Koormuse tasakaalu anal\u00fc\u00fcsimisel oleme juba arutanud teenusekontrollerite varundamist. Kuid messaging ka peab olema varustatud. Kui s\u00f5lm v\u00f5i masin kukub, peab messaging automaatselt taastuma, ja seda v\u00f5imalikult kiiresti.<\/p>\n<p><\/p>\n<p>Oma projektides kasutan t\u00e4iendavaid s\u00f5lmi, mis haaravad koormuse, kui need kukuvad. Erlangis on olemas standardne rakendus OTP jaoks jaotatud re\u017eiimil. Jaotatud re\u017eiim teostab just seda, et ta taastab rikke korral kukkunud rakenduse teisel eelnevalt k\u00e4ivitatud s\u00f5lmel. Protsess on l\u00e4bipaistev: p\u00e4rast riket liigub rakendus automaatselt failover-s\u00f5lmele. T\u00e4iendavate \u00fcksikasjade lugemiseks vaata siit. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">siit<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">T\u00f5husus<\/h2>\n<p><\/p>\n<p>Proovime v\u00e4hemalt ligikaudselt v\u00f5rrelda rabbitmq ja meie kohandatud messagingut.<br \/>\nL\u00f6\u00f6nud leidsin <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 meeskonnalt.<\/p>\n<p><\/p>\n<p>Algse dokumendi punktis 6.14.1.2.1.2.2 esitatakse RPC CASTi tulemus:<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>Eelnevalt ei tee me t\u00e4iendavaid seadistusi OS tuumale ega erlang VM-ile. Testimistingimused:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Test k\u00e4ivitub \u00fchel erlangi s\u00f5lmel vanema i7-l t\u00f6\u00f6tavas s\u00fclearvutis.<\/li>\n<li>Klastri testid toimuvad 10G v\u00f5rgu serverites.<\/li>\n<li>Kood t\u00f6\u00f6tab docker konteinerites. V\u00f5rk NAT-re\u017eiimis.<\/li>\n<\/ul>\n<p><\/p>\n<p>Testi kood:<\/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>Stsenaarium 1:<\/em> Test k\u00e4ivitatakse vanema i7 mobiilversiooniga s\u00fclearvutil. Test, s\u00f5numite saatmine ja teenus toimivad \u00fchel s\u00f5lmel \u00fches docker-konteineris:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">J\u00e4rjestikused 10000 ts\u00fcklit umbes 0 sekundiga (26987 ts\u00fcklit\/s)\nJ\u00e4rjestikused 20000 ts\u00fcklit umbes 1 sekundiga (26915 ts\u00fcklit\/s)\nJ\u00e4rjestikused 100000 ts\u00fcklit umbes 4 sekundiga (26957 ts\u00fcklit\/s)\nParalleelsed 2 100000 ts\u00fcklit umbes 2 sekundiga (44240 ts\u00fcklit\/s)\nParalleelsed 4 100000 ts\u00fcklit umbes 2 sekundiga (53459 ts\u00fcklit\/s)\nParalleelsed 10 100000 ts\u00fcklit umbes 2 sekundiga (52283 ts\u00fcklit\/s)\nParalleelsed 100 100000 ts\u00fcklit umbes 3 sekundiga (49317 ts\u00fcklit\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Stsenaarium 2<\/em>: 3 s\u00f5lme, mis t\u00f6\u00f6tavad erinevates seadmetes docker'i all (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">J\u00e4rjestikused 10000 ts\u00fcklit umbes 1 sekundiga (8684 ts\u00fcklit\/s)\nJ\u00e4rjestikused 20000 ts\u00fcklit umbes 2 sekundiga (8424 ts\u00fcklit\/s)\nJ\u00e4rjestikused 100000 ts\u00fcklit umbes 12 sekundiga (8655 ts\u00fcklit\/s)\nParalleelsed 2 100000 ts\u00fcklit umbes 7 sekundiga (15160 ts\u00fcklit\/s)\nParalleelsed 4 100000 ts\u00fcklit umbes 5 sekundiga (19133 ts\u00fcklit\/s)\nParalleelsed 10 100000 ts\u00fcklit umbes 4 sekundiga (24399 ts\u00fcklit\/s)\nParalleelsed 100 100000 ts\u00fcklit umbes 3 sekundiga (34517 ts\u00fcklit\/s)<\/code><\/pre>\n<p><\/p>\n<p>K\u00f5igis juhtudes ei \u00fcletanud CPU kasutus 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Summary<\/h2>\n<p><\/p>\n<p>Loodan, et see ts\u00fckkel ei n\u00e4e v\u00e4lja nagu teadlikkuse dump ja minu kogemus toob t\u00f5elist kasu nii jaotatud s\u00fcsteemide uurijatele kui ka praktikutele, kes on oma \u00e4ris\u00fcsteemide jaotatud arhitektuuride rajamise teel alguses ja vaatavad huviga Erlangi\/Elixir'i, kuid kahtlevad, kas see on seda 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 tasuks k\u00f5ige p\u00f5hjalikumalt k\u00e4sitleda 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 kehtivusaeg: 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 gruppide raamatute rakendamise osas.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Kauplemise visualiseerimine: tikud, baarid, resolutsioonid. Kuidas salvestada ja kuidas kleepida.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Tagakorter. Planeerimine ja arendus. T\u00f6\u00f6tajate kontroll ja juhtumite uurimine.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Vaatame, milliseid liideseid vajame ja kuidas neid rakendada.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Teabe salvestamine: PostgreSQL, Timescale, Tarantool kauplemiss\u00fcsteemides.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reaktiivsus kauplemiss\u00fcsteemides.<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Muud. Kirjutan kommentaarides.<\/p>\n<\/li>\n<\/ul>\n<p>    H\u00e4\u00e4letas 6 kasutajat. 4 kasutajat j\u00e4id erapooletuks.<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 5.0.1.1 - 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\/et\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\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\/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 ehitusblokid. Teine l\u00e4henemine | ProHoster","description":"Teade Kolleege, suve keskpaiku plaanin v\u00e4lja anda veel \u00fche artiklite ts\u00fckli massturunduss\u00fcsteemide projekteerimise kohta: \"Eksperiment VTrade\" \u2014 katse kirjutada kauplemiss\u00fcsteemide raamistiku.","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.","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/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}]}}