{"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\/sv\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"Byggstenar f\u00f6r distribuerade applikationer. Andra tillv\u00e4gag\u00e5ngss\u00e4ttet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Tillk\u00e4nnagivande<\/strong><\/p>\n<p><\/p>\n<p><em>Kolleger, jag planerar att sl\u00e4ppa en ny serie artiklar om design av massservice-system under mitten av sommaren: \"Experiment VTrade\" \u2014 ett f\u00f6rs\u00f6k att skriva ett ramverk f\u00f6r handelssystem. Serien kommer att g\u00e5 igenom teorin och praktiken f\u00f6r att bygga en b\u00f6rs, auktion och butik. I slutet av artikeln f\u00f6resl\u00e5r jag att vi r\u00f6star p\u00e5 de \u00e4mnen som intresserar er mest.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Byggstenar f\u00f6r distribuerade applikationer. Andra tillv\u00e4gag\u00e5ngss\u00e4ttet\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Detta \u00e4r den sista artikeln i serien om distribuerade reaktiva applikationer p\u00e5 Erlang\/Elixir. I <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">den f\u00f6rsta artikeln<\/a><\/noindex> kan man hitta de teoretiska grunderna f\u00f6r reaktiv arkitektur. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Den andra artikeln<\/a><\/noindex> illustrerar de grundl\u00e4ggande m\u00f6nstren och mekanismerna f\u00f6r att bygga s\u00e5dana system.<\/p>\n<p><\/p>\n<p>Idag kommer vi att ta upp fr\u00e5gor om utvecklingen av kodbasen och projekten som helhet. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Organisering av tj\u00e4nster<\/h2>\n<p><\/p>\n<p>I verkliga livet, vid utvecklingen av en tj\u00e4nst, m\u00e5ste man ofta kombinera flera interaktionsm\u00f6nster i en och samma kontroller. Till exempel, tj\u00e4nsten users, som hanterar anv\u00e4ndarprofiler, b\u00f6r svara p\u00e5 req-resp-f\u00f6rfr\u00e5gningar och meddela om uppdateringar av profiler via pub-sub. Detta fall \u00e4r ganska enkelt: f\u00f6r messaging st\u00e5r en kontroller som implementerar tj\u00e4nstens logik och publicerar uppdateringar.<\/p>\n<p><\/p>\n<p>Situationen kompliceras n\u00e4r vi m\u00e5ste implementera en felresistent distribuerad tj\u00e4nst. L\u00e5t oss anta att kraven p\u00e5 users har \u00e4ndrats: <\/p>\n<p><\/p>\n<ol>\n<li>nu m\u00e5ste tj\u00e4nsten kunna hantera f\u00f6rfr\u00e5gningar p\u00e5 5 noder i klustret, <\/li>\n<li>ha m\u00f6jlighet att utf\u00f6ra bakgrundsbehandling, <\/li>\n<li>samt kunna hantera abonnemangslister f\u00f6r uppdateringar av profiler dynamiskt.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>Anm\u00e4rkning:<\/em> Fr\u00e5gan om konsekvent lagring och replikering av data ska vi inte behandla. L\u00e5t oss anta att dessa fr\u00e5gor har l\u00f6sts tidigare och att det redan finns ett tillf\u00f6rlitligt och skalbart lagringsskikt i systemet, och att hanterarna har mekanismer f\u00f6r att interagera med det.<\/p>\n<p><\/p>\n<p>Den formella beskrivningen av tj\u00e4nsten users har blivit mer komplex. Fr\u00e5n programm\u00f6rens perspektiv, tack vare anv\u00e4ndningen av messaging, \u00e4r f\u00f6r\u00e4ndringarna minimala. F\u00f6r att uppfylla det f\u00f6rsta kravet m\u00e5ste vi konfigurera belastningsbalansering vid punktutbytet a req-resp. <\/p>\n<p><\/p>\n<p>Kravet p\u00e5 att hantera bakgrundsuppgifter uppst\u00e5r ofta. I anv\u00e4ndarna kan detta vara kontroller av anv\u00e4ndardokument, bearbetning av uppladdad multimedia eller synkronisering av data med sociala n\u00e4tverk. Dessa uppgifter m\u00e5ste f\u00f6rdelas p\u00e5 n\u00e5got s\u00e4tt inom klustret och \u00f6vervakas. D\u00e4rf\u00f6r har vi tv\u00e5 l\u00f6sningar: antingen anv\u00e4nda distributionsmallen fr\u00e5n den tidigare artikeln, eller, om den inte passar, skriva en anpassad uppgiftsplanerare som p\u00e5 det s\u00e4ttet hanterar poolen av bearbetare. <\/p>\n<p><\/p>\n<p>Punkt 3 kr\u00e4ver en utvidgning av pub-sub-mallen. F\u00f6r att genomf\u00f6ra detta, efter att ha skapat en pub-sub-b\u00f6rspunkten, beh\u00f6ver vi ocks\u00e5 starta controllern f\u00f6r denna punkt inom v\u00e5r tj\u00e4nst. P\u00e5 s\u00e5 s\u00e4tt flyttar vi logiken f\u00f6r prenumeration och avprenumeration fr\u00e5n meddelandelagret till implementationen av anv\u00e4ndarna.<\/p>\n<p><\/p>\n<p>Som ett resultat visade nedbrytningen av uppgiften att f\u00f6r att uppfylla kraven beh\u00f6ver vi k\u00f6ra 5 instanser av tj\u00e4nsten p\u00e5 olika noder och skapa en ytterligare entitet \u2013 en pub-sub-kontroller som ansvarar f\u00f6r prenumerationen.<br \/>\nF\u00f6r att starta 5 bearbetare kr\u00e4vs det inte att \u00e4ndra koden f\u00f6r tj\u00e4nsten. Den enda ytterligare \u00e5tg\u00e4rden \u2013 konfigurera balansregler vid b\u00f6rspunkten, vilket vi kommer att diskutera lite senare.<br \/>\nDet uppstod ocks\u00e5 en ytterligare sv\u00e5righet: pub-sub-kontrollern och den anpassade uppgiftsplaneraren m\u00e5ste arbeta i en enda instans. \u00c5terigen m\u00e5ste meddelandetj\u00e4nsten, som \u00e4r fundamental, ge en mekanism f\u00f6r att v\u00e4lja en ledare.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Val av ledare<\/h3>\n<p><\/p>\n<p>I distribuerade system \u00e4r valet av ledare \u2013 proceduren att utse en enda process som ansvarar f\u00f6r att planera distribuerad bearbetning av viss belastning. <\/p>\n<p><\/p>\n<p>I system som inte \u00e4r ben\u00e4gna till centralisering till\u00e4mpas universella algoritmer och algoritmer baserade p\u00e5 konsensus, s\u00e5som paxos eller raft.<br \/>\nEftersom meddelandetj\u00e4nsten \u00e4r en broker och en central komponent, k\u00e4nner den till alla kontroller av tj\u00e4nsten \u2013 kandidaterna till ledare. Meddelandetj\u00e4nsten kan utse en ledare utan att h\u00e5lla omr\u00f6stning.<\/p>\n<p><\/p>\n<p>Alla tj\u00e4nster f\u00e5r efter start och anslutning till b\u00f6rspunkten ett systemmeddelande <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. Om <code>LeaderPid<\/code> \u00f6verensst\u00e4mmer med <code>pid<\/code> den aktuella processen, utses den som ledare, och listan <code>Servers<\/code> inkluderar alla noder och deras parametrar.<br \/>\nVid tillkomsten av en ny och avst\u00e4ngningen av en fungerande nod i klustret, mottar alla tj\u00e4nstkontrollerare <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> och <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> respektive.<\/p>\n<p><\/p>\n<p>P\u00e5 s\u00e5 s\u00e4tt k\u00e4nner alla komponenter till alla f\u00f6r\u00e4ndringar, och i klustret garanteras det att en ledare finns vid varje given tidpunkt.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Medlare<\/h2>\n<p><\/p>\n<p>F\u00f6r att implementera komplexa distribuerade processer f\u00f6r bearbetning samt f\u00f6r att optimera redan befintlig arkitektur \u00e4r det praktiskt att anv\u00e4nda medlare.<br \/>\nF\u00f6r att undvika att \u00e4ndra tj\u00e4nsternas kod och hantera till exempel uppgifter f\u00f6r ytterligare bearbetning, ruttning eller loggning av meddelanden, kan en proxybehandlare inkluderas framf\u00f6r tj\u00e4nsten, som utf\u00f6r hela det ytterligare arbetet.<\/p>\n<p><\/p>\n<p>Ett klassiskt exempel p\u00e5 optimering av pub-sub \u00e4r en distribuerad applikation med en aff\u00e4rsk\u00e4rna som genererar uppdateringsh\u00e4ndelser, som f\u00f6r\u00e4ndringar i marknadspriser, och \u00e5tkomstlagret \u2014 N servrar som tillhandah\u00e5ller websocket-API f\u00f6r webklienter.<br \/>\nOm vi l\u00f6ser det \u201drakt p\u00e5\u201d ser kundservicen ut som f\u00f6ljer:<\/p>\n<p><\/p>\n<ul>\n<li>kunden uppr\u00e4ttar anslutningar med plattformen. P\u00e5 serversidan, d\u00e4r trafiken termineras, startar en process som hanterar denna anslutning.<\/li>\n<li>i kontexten av den hanterande processen sker autentisering och prenumeration p\u00e5 uppdateringar. Processen anropar subscribe-metoden f\u00f6r \u00e4mnena.<\/li>\n<li>Efter att h\u00e4ndelsen har genererats i k\u00e4rnan, levereras den till processerna som hanterar anslutningarna.<\/li>\n<\/ul>\n<p><\/p>\n<p>L\u00e5t oss f\u00f6rest\u00e4lla oss att vi har 50000 prenumeranter p\u00e5 \u00e4mnet \"nyheter\". Prenumeranterna \u00e4r j\u00e4mnt f\u00f6rdelade \u00f6ver 5 servrar. Som ett resultat kommer varje uppdatering som n\u00e5r bytespunkten att replikeras 50000 g\u00e5nger: 10000 g\u00e5nger p\u00e5 varje server, baserat p\u00e5 antalet prenumeranter p\u00e5 den. Inte riktigt en effektiv l\u00f6sning, eller hur?<br \/>\nF\u00f6r att f\u00f6rb\u00e4ttra situationen kommer vi att inf\u00f6ra en proxy som har samma namn som bytespunkten. Den globala namnregistratorn m\u00e5ste kunna returnera den n\u00e4rmaste processen efter namn, vilket \u00e4r viktigt.<\/p>\n<p><\/p>\n<p>Vi startar denna proxy p\u00e5 \u00e5tkomstservrarna, och alla v\u00e5ra processer som hanterar websocket-API kommer att prenumerera p\u00e5 den, ist\u00e4llet f\u00f6r p\u00e5 den ursprungliga pub-sub bytespunkten i k\u00e4rnan. Proxyen prenumererar p\u00e5 k\u00e4rnan endast vid unik prenumeration och replikar meddelandet som kommit in till alla sina prenumeranter.<br \/>\nSom ett resultat kommer 5 meddelanden att skickas mellan k\u00e4rnan och \u00e5tkomstservrarna ist\u00e4llet f\u00f6r 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Routing och lastbalansering<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>I den aktuella implementationen av messaging finns det 7 strategier f\u00f6r f\u00f6rdelning av f\u00f6rfr\u00e5gningar:<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. Beg\u00e4ran skickas till alla kontrollerare.<\/li>\n<li><code>round-robin<\/code>. Det sker en iteration och cyklisk distribution av beg\u00e4rningar mellan kontrollerarna.<\/li>\n<li><code>konsensus<\/code>. Kontrollerarna som betj\u00e4nar tj\u00e4nsten delas upp i en ledare och f\u00f6ljare. Beg\u00e4rningar skickas endast till ledaren.<\/li>\n<li><code>konsensus &amp; rundrobin<\/code>. I gruppen finns det en ledare, men beg\u00e4rningarna distribueras mellan alla medlemmar.<\/li>\n<li><code>sticky<\/code>. En hash-funktion ber\u00e4knas och knyts till en specifik behandlare. Efterf\u00f6ljande beg\u00e4rningar med denna signatur g\u00e5r till samma behandlare.<\/li>\n<li><code>sticky-fun<\/code>. Vid initialisering av meddelandepunkten skickas en hashber\u00e4kningsfunktion ytterligare f\u00f6r <code>sticky<\/code> balansering.<\/li>\n<li><code>kul<\/code>. Liknande sticky-fun, men kan ocks\u00e5 vidarebefordra, avvisa eller f\u00f6rbearbeta. <\/li>\n<\/ul>\n<p><\/p>\n<p>Strategin f\u00f6r distribution anges vid initialisering av meddelandepunkten.<\/p>\n<p><\/p>\n<p>F\u00f6rutom balansering m\u00f6jligg\u00f6r messaging att tagga enheter. L\u00e5t oss \u00f6verv\u00e4ga typer av taggar i systemet:<\/p>\n<p><\/p>\n<ul>\n<li>Anslutningstag. G\u00f6r det m\u00f6jligt att f\u00f6rst\u00e5 genom vilken anslutning h\u00e4ndelserna kom. Anv\u00e4nds n\u00e4r kontrollerprocessen kopplar till en meddelandepunkt, men med olika routingnycklar. <\/li>\n<li>Tj\u00e4nstag. G\u00f6r det m\u00f6jligt att gruppera behandlare f\u00f6r en tj\u00e4nst och ut\u00f6ka routing- och balanseringsm\u00f6jligheterna. F\u00f6r req-resp-m\u00f6nstret \u00e4r routing linj\u00e4r. Vi skickar en beg\u00e4ran till meddelandepunkten, som sedan vidarebefordrar den till tj\u00e4nsten. Men om vi beh\u00f6ver dela upp behandlarna i logiska grupper, g\u00f6rs uppdelningen med hj\u00e4lp av taggar. Genom att ange en tagg riktas beg\u00e4ran till en specifik grupp operat\u00f6rer.<\/li>\n<li>Beg\u00e4rningstag. G\u00f6r det m\u00f6jligt att s\u00e4rskilja svar. Eftersom v\u00e5rt system \u00e4r asynkront m\u00e5ste man kunna ange RequestTag vid skickandet av en beg\u00e4ran f\u00f6r att kunna hantera svaren fr\u00e5n tj\u00e4nsten. Genom den kan vi f\u00f6rst\u00e5 vilket svar som kom till oss.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>F\u00f6r pub-sub \u00e4r det lite enklare. Vi har en meddelandepunkt till vilken meddelanden publiceras. Meddelandepunkten distribuerar meddelanden mellan prenumeranterna som prenumererat p\u00e5 de routingnycklar som de beh\u00f6ver (man kan s\u00e4ga att detta \u00e4r en analogi till teman).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">Skalbarhet och driftss\u00e4kerhet<\/h2>\n<p><\/p>\n<p>Skalbarheten i systemet som helhet beror p\u00e5 graden av skalbarhet i lagren och komponenterna i systemet:<\/p>\n<p><\/p>\n<ul>\n<li>Tj\u00e4nster skalas genom att l\u00e4gga till fler noder med servicehanterare i klustret. Under erfaren drift kan man v\u00e4lja den optimala belastningsbalanseringspolitiken.<\/li>\n<li>Messagingtj\u00e4nsten inom ett separat kluster skalas i allm\u00e4nhet antingen genom att s\u00e4rskilt belastade utbyten flyttas till separata klusternoder eller genom att l\u00e4gga till proxyprocesser i s\u00e4rskilt belastade omr\u00e5den av klustret.<\/li>\n<li>Systemets skalbarhet som en egenskap beror p\u00e5 flexibiliteten i arkitekturen och m\u00f6jligheten att kombinera separata kluster till en enhetlig logisk entitet.<\/li>\n<\/ul>\n<p><\/p>\n<p>Framg\u00e5ngen f\u00f6r ett projekt beror ofta p\u00e5 enkelheten och hastigheten i skalning. Messaging i sin nuvarande implementering v\u00e4xer tillsammans med applikationen. \u00c4ven om vi inte har tillr\u00e4ckligt med kluster med 50-60 maskiner kan vi \u00e5terg\u00e5 till federation. Tyv\u00e4rr faller \u00e4mnet federation utanf\u00f6r ramen f\u00f6r denna artikel.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Reservkraft<\/h2>\n<p><\/p>\n<p>Vid diskussionen om belastningsbalansering har vi redan talat om reservcontroller f\u00f6r tj\u00e4nster. Men messaging m\u00e5ste ocks\u00e5 vara reserverat. Vid en nod- eller maskinfel m\u00e5ste messaging automatiskt \u00e5terst\u00e4llas, och det ska ske s\u00e5 snabbt som m\u00f6jligt.<\/p>\n<p><\/p>\n<p>I mina projekt anv\u00e4nder jag extra noder som tar \u00f6ver belastningen vid ett fel. I Erlang finns det en standardimplementation av distribuerat l\u00e4ge f\u00f6r OTP-appar. Det distribuerade l\u00e4get genomf\u00f6r just \u00e5terst\u00e4llning vid fel genom att starta den kraschade applikationen p\u00e5 en annan f\u00f6rhandsstartad nod. Processen \u00e4r transparent, efter ett fel flyttas applikationen automatiskt till en failover-nod. Du kan l\u00e4sa mer om denna funktionalitet. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">). Ett typiskt exempel p\u00e5 anv\u00e4ndning:<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">Performance<\/h2>\n<p><\/p>\n<p>L\u00e5t oss f\u00f6rs\u00f6ka j\u00e4mf\u00f6ra prestandan mellan rabbitmq och v\u00e5r anpassade messaging.<br \/>\nJag har hittat <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">officiella resultat<\/a><\/noindex> av rabbitmq-testningen utf\u00f6rd av openstack-teamet.<\/p>\n<p><\/p>\n<p>I punkt 6.14.1.2.1.2.2 i det ursprungliga dokumentet presenteras resultatet av RPC CAST:<br \/>\n<img decoding=\"async\" alt=\"Byggstenar f\u00f6r distribuerade applikationer. Andra tillv\u00e4gag\u00e5ngss\u00e4ttet\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Det kommer inte att g\u00f6ras n\u00e5gra ytterligare inst\u00e4llningar i OS-k\u00e4rnan eller Erlang VM. Villkor f\u00f6r testning:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Testet i ett enda Erlang-nod k\u00f6rs p\u00e5 en gammal b\u00e4rbar dator med en mobil i7.<\/li>\n<li>Klustertester genomf\u00f6rs p\u00e5 servrar med 10G-n\u00e4tverk.<\/li>\n<li>Koden k\u00f6rs i dockercontainrar. N\u00e4tverket fungerar i NAT-l\u00e4ge.<\/li>\n<\/ul>\n<p><\/p>\n<p>Testkoden:<\/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>Scenario 1:<\/em> Testet k\u00f6rs p\u00e5 en laptop med en gammal b\u00e4rbar i7. Testet, messaging och tj\u00e4nsten k\u00f6rs p\u00e5 samma nod i en docker-container:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sekventiella 10000 cykler p\u00e5 ~0 sekunder (26987 cykler\/s)\nSekventiella 20000 cykler p\u00e5 ~1 sekunder (26915 cykler\/s)\nSekventiella 100000 cykler p\u00e5 ~4 sekunder (26957 cykler\/s)\nParallella 2 100000 cykler p\u00e5 ~2 sekunder (44240 cykler\/s)\nParallella 4 100000 cykler p\u00e5 ~2 sekunder (53459 cykler\/s)\nParallella 10 100000 cykler p\u00e5 ~2 sekunder (52283 cykler\/s)\nParallella 100 100000 cykler p\u00e5 ~3 sekunder (49317 cykler\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Scenario 2<\/em>: 3 noder som k\u00f6rs p\u00e5 olika maskiner under docker (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Sekventiella 10000 cykler p\u00e5 ~1 sekunder (8684 cykler\/s)\nSekventiella 20000 cykler p\u00e5 ~2 sekunder (8424 cykler\/s)\nSekventiella 100000 cykler p\u00e5 ~12 sekunder (8655 cykler\/s)\nParallella 2 100000 cykler p\u00e5 ~7 sekunder (15160 cykler\/s)\nParallella 4 100000 cykler p\u00e5 ~5 sekunder (19133 cykler\/s)\nParallella 10 100000 cykler p\u00e5 ~4 sekunder (24399 cykler\/s)\nParallella 100 100000 cykler p\u00e5 ~3 sekunder (34517 cykler\/s)<\/code><\/pre>\n<p><\/p>\n<p>I alla fall \u00f6versteg CPU-anv\u00e4ndningen inte 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Sammanfattning<\/h2>\n<p><\/p>\n<p>Jag hoppas att denna cykel inte verkar som en informationsdump och att min erfarenhet kommer att ge verkligt v\u00e4rde b\u00e5de f\u00f6r forskare inom distribuerade system och praktiker som \u00e4r i b\u00f6rjan av sin resa att bygga distribuerade arkitekturer f\u00f6r sina aff\u00e4rssystem och nyfiket ser p\u00e5 Erlang\/Elixir, men tvekar om det \u00e4r v\u00e4rt att...<\/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\">Endast registrerade anv\u00e4ndare kan delta i omr\u00f6stningen. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Logga in<\/a><\/noindex>, tack.<\/p>\n<h2 class=\"default-block__polling-title\">Vilka \u00e4mnen b\u00f6r jag belysa mer detaljerat inom ramen f\u00f6r cykeln 'Experiment VTrade'?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Teori: Marknader, order och deras giltighetstid: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Orderbok. Teori och praktik av genomf\u00f6rande av en bok med grupperingar<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Visualisering av handel: Tickar, staplar, uppl\u00f6sningar. Hur man lagrar och hur man klistrar ihop<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Backoffice. Planering och utveckling. \u00d6vervakning av anst\u00e4llda och utredning av incidenter<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Vi g\u00e5r igenom vilka gr\u00e4nssnitt som beh\u00f6vs och hur man implementerar dem<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Informationslagring: PostgreSQL, Timescale, Tarantool i handelssystem<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reaktivitet i handelssystem<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Annat. Jag skriver i kommentarerna<\/p>\n<\/li>\n<\/ul>\n<p>    6 anv\u00e4ndare r\u00f6stade. 4 anv\u00e4ndare avstod.<br \/>\n<br \/>K\u00e4lla: <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.4 - 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\/sv\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Byggstenar f\u00f6r distribuerade applikationer. Andra n\u00e4rmandet | ProHoster","description":"Announcement Kollega, i mitten av sommaren planerar jag att sl\u00e4ppa ytterligare en serie artiklar om design av massservice-system: 'Experiment VTrade' - ett f\u00f6rs\u00f6k att skriva ett ramverk f\u00f6r handel.","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/31124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}