{"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\/it\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"Costruzione di blocchi per applicazioni distribuite. Secondo approccio","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Annuncio<\/strong><\/p>\n<p><\/p>\n<p><em>Colleghi, a met\u00e0 estate prevedo di pubblicare un altro ciclo di articoli sul design dei sistemi di servizi di massa: \u201cEsperimento VTrade\u201d \u2014 un tentativo di scrivere un framework per sistemi di trading. Nel ciclo verr\u00e0 esaminata sia la teoria che la pratica della creazione di una borsa, un'asta e un negozio. Alla fine dell'articolo invito a votare per gli argomenti che vi interessano di pi\u00f9.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Costruzione di blocchi per applicazioni distribuite. Secondo approccio\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Questo \u00e8 l'ultimo articolo del ciclo sulle applicazioni reattive distribuite in Erlang\/Elixir. Nel <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">primo articolo<\/a><\/noindex> si possono trovare le basi teoriche dell'architettura reattiva. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Secondo articolo<\/a><\/noindex> illustra i principali modelli e meccanismi per la costruzione di sistemi simili.<\/p>\n<p><\/p>\n<p>Oggi affronteremo questioni relative allo sviluppo del codice e ai progetti nel loro complesso. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Organizzazione dei servizi<\/h2>\n<p><\/p>\n<p>Nella vita reale, durante lo sviluppo di un servizio, spesso \u00e8 necessario combinare diversi modelli di interazione in un unico controller. Ad esempio, il servizio users, che gestisce i profili degli utenti del progetto, deve rispondere alle richieste req-resp e informare sugli aggiornamenti dei profili tramite pub-sub. Questo caso \u00e8 piuttosto semplice: a gestire il messaging c'\u00e8 un singolo controller che implementa la logica del servizio e pubblica gli aggiornamenti.<\/p>\n<p><\/p>\n<p>La situazione si complica quando dobbiamo realizzare un servizio distribuito e a prova di guasto. Immaginiamo che i requisiti per users siano cambiati: <\/p>\n<p><\/p>\n<ol>\n<li>ora il servizio deve gestire le richieste su 5 nodi del cluster, <\/li>\n<li>essere in grado di eseguire compiti in background, <\/li>\n<li>e anche gestire dinamicamente le liste di iscrizione agli aggiornamenti dei profili.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>Nota:<\/em> Non consideriamo la questione della conservazione e replicazione consistente dei dati. Presumiamo che queste questioni siano state risolte in precedenza e che nella sistema esista gi\u00e0 uno strato di memorizzazione affidabile e scalabile, mentre i gestori hanno meccanismi per interagire con esso.<\/p>\n<p><\/p>\n<p>La descrizione formale del servizio utenti \u00e8 diventata pi\u00f9 complessa. Dal punto di vista del programmatore, grazie all'uso del messaging, le modifiche sono minime. Per soddisfare il primo requisito, dobbiamo configurare il bilanciamento presso il punto di scambio req-resp. <\/p>\n<p><\/p>\n<p>La necessit\u00e0 di gestire i compiti in background si presenta frequentemente. Nel contesto degli utenti, questo pu\u00f2 includere controlli sui documenti degli utenti, elaborazione di multimedia caricato o sincronizzazione dei dati con i social media. Queste attivit\u00e0 devono essere distribuite all'interno del cluster e monitorate. Pertanto, abbiamo due opzioni: utilizzare il modello di distribuzione dei compiti dell'articolo precedente, oppure, se non si adatta, scrivere un pianificatore di compiti personalizzato che gestisca il pool di elaboratori nel modo necessario. <\/p>\n<p><\/p>\n<p>Il punto 3 richiede l'espansione del modello pub-sub. Per implementarlo, dopo aver creato il punto di scambio pub-sub, dobbiamo anche avviare un controller di quel punto all'interno del nostro servizio. In questo modo, sembrerebbe che trasferiamo la logica di gestione dell'iscrizione e delle disiscrizioni dallo strato messaging all'implementazione degli utenti.<\/p>\n<p><\/p>\n<p>Di conseguenza, la scomposizione del compito ha mostrato che per soddisfare i requisiti dobbiamo avviare 5 istanze del servizio su diversi nodi e creare un'entit\u00e0 aggiuntiva: un controller pub-sub, responsabile dell'iscrizione.<br \/>\nPer avviare 5 gestori non \u00e8 necessario modificare il codice del servizio. L'unica azione aggiuntiva \u00e8 configurare le regole di bilanciamento al punto di scambio, di cui parleremo pi\u00f9 avanti.<br \/>\nSi \u00e8 presentata anche un'ulteriore complessit\u00e0: il controller pub-sub e il pianificatore di attivit\u00e0 personalizzato devono funzionare in un'unica istanza. Ancora una volta, il servizio messaging, in quanto fondamentale, deve fornire un meccanismo di leadership.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Scelta del leader<\/h3>\n<p><\/p>\n<p>Nei sistemi distribuiti, la selezione di un leader \u00e8 la procedura di designazione di un unico processo responsabile della pianificazione dell'elaborazione distribuita di un certo carico. <\/p>\n<p><\/p>\n<p>Nei sistemi che non tendono alla centralizzazione, si applicano algoritmi generali e algoritmi basati sul consenso, come Paxos o Raft.<br \/>\nPoich\u00e9 il messaging funge da broker e elemento centrale, \u00e8 a conoscenza di tutti i controller del servizio che sono candidati a diventare leader. Il messaging pu\u00f2 nominare un leader senza alcuna votazione.<\/p>\n<p><\/p>\n<p>Tutti i servizi, dopo l'avvio e la connessione al punto di scambio, ricevono un messaggio di sistema. <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. Nel caso in cui <code>LeaderPid<\/code> corrisponda al <code>pid<\/code> processo attuale, viene nominato leader e l'elenco <code>Servers<\/code> include tutti i nodi e i loro parametri.<br \/>\nNel momento in cui appare un nuovo nodo e uno funzionante viene disattivato nel cluster, tutti i controller del servizio ricevono <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> e <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> rispettivamente.<\/p>\n<p><\/p>\n<p>In questo modo, tutti i componenti sono a conoscenza di tutte le modifiche e nel cluster \u00e8 garantito un solo leader in ogni momento.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Intermediari<\/h2>\n<p><\/p>\n<p>Per implementare processi distribuiti complessi e ottimizzare l'architettura esistente, \u00e8 utile utilizzare intermediari.<br \/>\nPer non dover modificare il codice dei servizi e affrontare, ad esempio, la registrazione o la logistica dei messaggi, \u00e8 possibile inserire un gestore proxy davanti al servizio, che eseguir\u00e0 tutto il lavoro aggiuntivo.<\/p>\n<p><\/p>\n<p>Un classico esempio di ottimizzazione pub-sub \u00e8 un'applicazione distribuita con un core di business che genera eventi di aggiornamento, come ad esempio una variazione del prezzo sul mercato, e uno strato di accesso costituito da N server che forniscono un'API websocket per i clienti web.<br \/>\nSe affrontiamo il problema in modo diretto, la gestione del cliente appare nel seguente modo:<\/p>\n<p><\/p>\n<ul>\n<li>il cliente stabilisce le connessioni con la piattaforma. Sul lato server, dove termina il traffico, avviene l'avvio di un processo che gestisce questa connessione.<\/li>\n<li>nel contesto del processo di gestione, avviene l'autenticazione e la sottoscrizione agli aggiornamenti. Il processo chiama il metodo subscribe per i topic.<\/li>\n<li>dopo la generazione di un evento nel core, esso viene recapitato ai processi che gestiscono le connessioni.<\/li>\n<\/ul>\n<p><\/p>\n<p>Immaginiamo di avere 50000 iscritti al topic \"news\". Gli iscritti sono distribuiti uniformemente su 5 server. Di conseguenza, ogni aggiornamento, giungendo al punto di scambio, verr\u00e0 replicato 50000 volte: 10000 volte su ciascun server, in base al numero di iscritti su di esso. Non \u00e8 proprio un sistema efficiente, vero?<br \/>\nPer migliorare la situazione, introduciamo un proxy con lo stesso nome del punto di scambio. Il registrar dei nomi globali deve essere in grado di restituire il processo pi\u00f9 vicino per nome, ed \u00e8 fondamentale.<\/p>\n<p><\/p>\n<p>Avvieremo questo proxy sui server del layer di accesso, e tutti i nostri processi che gestiscono l'API websocket si iscriveranno a esso, anzich\u00e9 al punto di scambio pub-sub originale nel core. Il proxy si iscrive al core solo in caso di iscrizione unica e replica il messaggio ricevuto a tutti i suoi iscritti.<br \/>\nDi conseguenza, tra il core e i server di accesso verranno trasmessi 5 messaggi, invece di 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Routing e bilanciamento<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>Nell'attuale implementazione del messaging esistono 7 strategie di distribuzione delle richieste:<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. La richiesta viene inviata a tutti i controller.<\/li>\n<li><code>round-robin<\/code>. Viene effettuato un ciclo e una distribuzione ciclica delle richieste tra i controller.<\/li>\n<li><code>consenso<\/code>. I controller che servono il servizio sono divisi in un leader e dei subordinati. Le richieste vengono inviate solo al leader.<\/li>\n<li><code>consenso &amp; round-robin<\/code>. Nel gruppo c'\u00e8 un leader, ma le richieste sono distribuite tra tutti i membri.<\/li>\n<li><code>sticky<\/code>. Viene calcolata la funzione hash e associata a un determinato gestore. Le richieste successive con questa firma vengono indirizzate a questo stesso gestore.<\/li>\n<li><code>sticky-fun<\/code>. Durante l'inizializzazione del punto di scambio viene inoltre fornita una funzione per il calcolo dell'hash per <code>sticky<\/code> il bilanciamento.<\/li>\n<li><code>divertimento<\/code>. Simile a sticky-fun, ma consente anche di reindirizzare, rifiutare o pre-elaborare. <\/li>\n<\/ul>\n<p><\/p>\n<p>La strategia di distribuzione viene definita durante l'inizializzazione del punto di scambio.<\/p>\n<p><\/p>\n<p>Oltre al bilanciamento, il messaging consente di etichettare le entit\u00e0. Esaminiamo i tipi di etichette nel sistema:<\/p>\n<p><\/p>\n<ul>\n<li>Etichetta di connessione. Consente di capire attraverso quale connessione sono arrivati gli eventi. Viene utilizzata quando il processo del controller si connette a un singolo punto di scambio, ma con diverse chiavi di instradamento. <\/li>\n<li>Tag del servizio. Permette di raggruppare i gestori e di ampliare le funzionalit\u00e0 di instradamento e bilanciamento per un servizio. Per il pattern req-resp, l'instradamento \u00e8 lineare. Inviamo la richiesta al punto di scambio, che la trasmette al servizio. Ma se dobbiamo suddividere i gestori in gruppi logici, il raggruppamento avviene tramite i tag. Specificando un tag, la richiesta verr\u00e0 indirizzata a un gruppo specifico di controller.<\/li>\n<li>Tag della richiesta. Permette di distinguere le risposte. Poich\u00e9 il nostro sistema \u00e8 asincrono, per elaborare le risposte del servizio \u00e8 necessario avere la possibilit\u00e0 di indicare il RequestTag quando si invia la richiesta. Grazie a questo, possiamo capire a quale richiesta \u00e8 arrivata la risposta.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>Per pub-sub \u00e8 tutto un po' pi\u00f9 semplice. Abbiamo un punto di scambio al quale vengono pubblicati i messaggi. Il punto di scambio distribuisce i messaggi tra i sottoscrittori che si sono iscritti alle chiavi di instradamento di loro interesse (si pu\u00f2 dire che \u00e8 analogo ai temi).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">Scalabilit\u00e0 e resilienza<\/h2>\n<p><\/p>\n<p>La scalabilit\u00e0 del sistema nel suo complesso dipende dal grado di scalabilit\u00e0 dei livelli e dei componenti del sistema:<\/p>\n<p><\/p>\n<ul>\n<li>I servizi si scalano aggiungendo ulteriori nodi con gestori di questo servizio al cluster. Durante l'operativit\u00e0 esperta, \u00e8 possibile scegliere la politica di bilanciamento ottimale.<\/li>\n<li>Il servizio di messaging all'interno di un cluster separato, in generale, si scalano o spostando le aree di scambio particolarmente cariche su nodi separati del cluster, o aggiungendo processi proxy nelle zone di alta intensit\u00e0 del cluster.<\/li>\n<li>La scalabilit\u00e0 dell'intero sistema come caratteristica dipende dalla flessibilit\u00e0 dell'architettura e dalla possibilit\u00e0 di unire cluster singoli in un'entit\u00e0 logica comune.<\/li>\n<\/ul>\n<p><\/p>\n<p>Il successo del progetto spesso dipende dalla semplicit\u00e0 e rapidit\u00e0 di scalabilit\u00e0. Il messaging nell'attuale implementazione cresce insieme all'applicazione. Anche se non abbiamo abbastanza cluster con 50-60 macchine, possiamo ricorrere alla federazione. Purtroppo, il tema della federazione esula da questo articolo.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Riserva<\/h2>\n<p><\/p>\n<p>Quando abbiamo analizzato il bilanciamento del carico, abbiamo gi\u00e0 discusso della ridondanza dei controller dei servizi. Tuttavia, anche il messaging deve essere ridondato. In caso di guasto di un nodo o di una macchina, il messaging deve riprendersi automaticamente nel pi\u00f9 breve tempo possibile.<\/p>\n<p><\/p>\n<p>Nei miei progetti utilizzo nodi aggiuntivi che gestiscono il carico in caso di guasto. In Erlang esiste un'implementazione standard della modalit\u00e0 distribuita per le applicazioni OTP. La modalit\u00e0 distribuita consente proprio di ripristinare in caso di errore avviando l'applicazione che \u00e8 andata in crash su un altro nodo preavviato. Il processo \u00e8 trasparente, dopo un guasto l'applicazione si sposta automaticamente sul nodo di failover. Puoi leggere di pi\u00f9 su questa funzionalit\u00e0. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">qui<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">Prestazioni<\/h2>\n<p><\/p>\n<p>Proviamo a confrontare, anche se solo approssimativamente, le prestazioni di rabbitmq e del nostro sistema di messaggistica personalizzato.<br \/>\nHo trovato <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">risultati ufficiali<\/a><\/noindex> dei test di rabbitmq effettuati dal team di openstack.<\/p>\n<p><\/p>\n<p>Nel punto 6.14.1.2.1.2.2. del documento originale \u00e8 presentato il risultato di RPC CAST:<br \/>\n<img decoding=\"async\" alt=\"Costruzione di blocchi per applicazioni distribuite. Secondo approccio\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Inizialmente non apporteremo alcuna configurazione aggiuntiva al kernel OS o alla VM Erlang. Condizioni per il test:<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Il test su un singolo nodo Erlang viene eseguito su un notebook con un vecchio i7 in versione mobile.<\/li>\n<li>I test del cluster si svolgono su server con rete 10G.<\/li>\n<li>Il codice funziona in contenitori Docker. Rete in modalit\u00e0 NAT.<\/li>\n<\/ul>\n<p><\/p>\n<p>Codice del test:<\/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> Il test viene eseguito su un laptop con un vecchio processore i7 mobile. Il test, il messaging e il servizio vengono eseguiti su un singolo nodo all'interno dello stesso contenitore docker:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Cicli sequenziali da 10000 in ~0 secondi (26987 cicli\/s)\nCicli sequenziali da 20000 in ~1 secondo (26915 cicli\/s)\nCicli sequenziali da 100000 in ~4 secondi (26957 cicli\/s)\nCicli paralleli da 2 100000 in ~2 secondi (44240 cicli\/s)\nCicli paralleli da 4 100000 in ~2 secondi (53459 cicli\/s)\nCicli paralleli da 10 100000 in ~2 secondi (52283 cicli\/s)\nCicli paralleli da 100 100000 in ~3 secondi (49317 cicli\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Scenario 2<\/em>: 3 nodi avviati su macchine diverse sotto docker (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Cicli sequenziali da 10000 in ~1 secondo (8684 cicli\/s)\nCicli sequenziali da 20000 in ~2 secondi (8424 cicli\/s)\nCicli sequenziali da 100000 in ~12 secondi (8655 cicli\/s)\nCicli paralleli da 2 100000 in ~7 secondi (15160 cicli\/s)\nCicli paralleli da 4 100000 in ~5 secondi (19133 cicli\/s)\nCicli paralleli da 10 100000 in ~4 secondi (24399 cicli\/s)\nCicli paralleli da 100 100000 in ~3 secondi (34517 cicli\/s)<\/code><\/pre>\n<p><\/p>\n<p>In tutti i casi, l'utilizzo della CPU non ha superato il 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">Risultati<\/h2>\n<p><\/p>\n<p>Spero che questo ciclo non sembri un flusso di coscienza e che la mia esperienza possa essere di reale aiuto sia per i ricercatori di sistemi distribuiti che per i praticanti che si trovano all'inizio del percorso di costruzione di architetture distribuite per i loro sistemi aziendali e che guardano con interesse a Erlang\/Elixir, ma dubitano se valga la pena...<\/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\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Quali temi dovrei approfondire maggiormente nel ciclo \"Esperimento VTrade\"?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Teoria: Mercati, ordini e il loro tempo di validit\u00e0: DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Libro degli ordini. Teoria e pratica dell'implementazione del libro con raggruppamenti<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Visualizzazione commerciale: Tick, barre, risoluzioni. Come memorizzare e come incollare<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Back office. Pianificazione e sviluppo. Monitoraggio dei dipendenti e investigazione degli incidenti<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Analizziamo quali interfacce servono e come realizzarle<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Memorizzazione delle informazioni: PostgreSQL, Timescale, Tarantool nei sistemi di trading<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Reattivit\u00e0 nei sistemi di trading<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Altro. Scriver\u00f2 nei commenti<\/p>\n<\/li>\n<\/ul>\n<p>    6 utenti hanno votato. 4 utenti si sono astenuti.<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Blocchi di costruzione delle applicazioni distribuite. Secondo approccio | ProHoster","description":"Annuncio Colleghi, a met\u00e0 estate ho in programma di pubblicare un ulteriore ciclo di articoli sulla progettazione di sistemi di servizio di massa: \"Esperimento VTrade\" \u2014 un tentativo di scrivere un framework per i sistemi di trading. Il ciclo esaminer\u00e0 la teoria e la pratica della costruzione di un mercato, un'asta e un negozio. Alla fine dell'articolo, vi consiglio di votare per gli argomenti che trovate pi\u00f9 interessanti. Questo \u00e8 l'ultimo articolo del ciclo sui sistemi reattivi distribuiti.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/31124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}