{"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\/fr\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","title":{"rendered":"\u00c9l\u00e9ments constitutifs des applications distribu\u00e9es. Deuxi\u00e8me approche","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Annonce<\/strong><\/p>\n<p><\/p>\n<p><em>Coll\u00e8gues, au milieu de l'\u00e9t\u00e9, je pr\u00e9vois de publier un autre cycle d'articles sur la conception de syst\u00e8mes de service de masse : \u00ab Exp\u00e9rience VTrade \u00bb \u2014 une tentative d'\u00e9crire un cadre pour les syst\u00e8mes de trading. Le cycle abordera la th\u00e9orie et la pratique de la construction d'une bourse, d'une ench\u00e8re et d'un magasin. \u00c0 la fin de l'article, je vous propose de voter pour les sujets qui vous int\u00e9ressent le plus.<br \/>\n<\/em><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00c9l\u00e9ments constitutifs des applications distribu\u00e9es. Deuxi\u00e8me approche\" src=\"\/wp-content\/uploads\/2019\/04\/358996733e805327b587176f4f992aea.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>C'est le dernier article de la s\u00e9rie sur les applications r\u00e9actives distribu\u00e9es en Erlang\/Elixir. Dans <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446028\/\">dans le premier article<\/a><\/noindex> vous pouvez trouver les bases th\u00e9oriques de l'architecture r\u00e9active. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/446108\/\">Le deuxi\u00e8me article<\/a><\/noindex> illustre les principaux mod\u00e8les et m\u00e9canismes de construction de tels syst\u00e8mes.<\/p>\n<p><\/p>\n<p>Aujourd'hui, nous aborderons les questions du d\u00e9veloppement de la base de code et des projets dans leur ensemble. <\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2 id=\"organizaciya-servisov\">Organisation des services<\/h2>\n<p><\/p>\n<p>Dans la vie r\u00e9elle, lors de la conception d'un service, on doit souvent combiner plusieurs mod\u00e8les d'interaction dans un seul contr\u00f4leur. Par exemple, le service users, qui s'occupe de la gestion des profils utilisateurs du projet, doit r\u00e9pondre aux requ\u00eates req-resp et informer des mises \u00e0 jour de profils via pub-sub. Ce cas est assez simple : un contr\u00f4leur g\u00e8re le messaging, impl\u00e9mentant la logique du service et publiant les mises \u00e0 jour.<\/p>\n<p><\/p>\n<p>La situation se complique lorsque nous devons mettre en place un service distribu\u00e9 tol\u00e9rant aux pannes. Imaginons que les exigences relatives aux users aient chang\u00e9 : <\/p>\n<p><\/p>\n<ol>\n<li>maintenant, le service doit traiter les requ\u00eates sur 5 n\u0153uds du cluster, <\/li>\n<li>avoir la capacit\u00e9 d'ex\u00e9cuter des t\u00e2ches de traitement en arri\u00e8re-plan, <\/li>\n<li>et aussi \u00eatre capable de g\u00e9rer dynamiquement les listes d'abonnement aux mises \u00e0 jour de profils.<\/li>\n<\/ol>\n<p><\/p>\n<p><em>Remarque :<\/em> Nous ne discutons pas de la question du stockage coh\u00e9rent et de la r\u00e9plication des donn\u00e9es. Supposons que ces questions aient \u00e9t\u00e9 r\u00e9solues au pr\u00e9alable et qu'il existe d\u00e9j\u00e0 dans le syst\u00e8me une couche de stockage fiable et \u00e9volutive, et que les gestionnaires aient des m\u00e9canismes pour interagir avec elle.<\/p>\n<p><\/p>\n<p>La description formelle du service users est devenue plus complexe. Du point de vue du programmeur, gr\u00e2ce \u00e0 l'utilisation du messaging, les changements sont minimes. Pour satisfaire \u00e0 la premi\u00e8re exigence, nous devons configurer la r\u00e9partition \u00e0 la point d'\u00e9change req-resp. <\/p>\n<p><\/p>\n<p>La n\u00e9cessit\u00e9 de traiter des t\u00e2ches en arri\u00e8re-plan se pr\u00e9sente souvent. Dans les utilisateurs, cela peut inclure des v\u00e9rifications de documents des utilisateurs, le traitement de multim\u00e9dias t\u00e9l\u00e9charg\u00e9s ou la synchronisation des donn\u00e9es avec les r\u00e9seaux sociaux. Ces t\u00e2ches doivent \u00eatre r\u00e9parties au sein du cluster et leur progression contr\u00f4l\u00e9e. Nous avons donc deux options : soit utiliser le mod\u00e8le de r\u00e9partition des t\u00e2ches de l'article pr\u00e9c\u00e9dent, soit, si cela ne convient pas, \u00e9crire un planificateur de t\u00e2ches personnalis\u00e9 qui g\u00e9rera le pool de travailleurs comme n\u00e9cessaire. <\/p>\n<p><\/p>\n<p>Le point 3 n\u00e9cessite une extension du mod\u00e8le pub-sub. Pour cela, apr\u00e8s avoir cr\u00e9\u00e9 un point d'\u00e9change pub-sub, nous devons \u00e9galement d\u00e9marrer le contr\u00f4leur de ce point dans notre service. Ainsi, nous extrayons la logique de gestion des abonnements et des d\u00e9sabonnements de la couche de messagerie vers l'impl\u00e9mentation des utilisateurs.<\/p>\n<p><\/p>\n<p>En fin de compte, la d\u00e9composition de la t\u00e2che a montr\u00e9 qu'afin de satisfaire les exigences, nous devions lancer 5 instances du service sur diff\u00e9rents n\u0153uds et cr\u00e9er une entit\u00e9 suppl\u00e9mentaire - un contr\u00f4leur pub-sub responsable des abonnements.<br \/>\nPour lancer 5 travailleurs, il n'est pas n\u00e9cessaire de modifier le code du service. La seule action suppl\u00e9mentaire consiste \u00e0 configurer les r\u00e8gles d'\u00e9quilibrage au point d'\u00e9change, ce dont nous discuterons un peu plus tard.<br \/>\nUne complexit\u00e9 suppl\u00e9mentaire est \u00e9galement apparue : le contr\u00f4leur pub-sub et le planificateur de t\u00e2ches personnalis\u00e9 doivent fonctionner en une seule instance. Encore une fois, le service de messagerie, en tant que fondamental, doit fournir un m\u00e9canisme de choix d'un leader.<\/p>\n<p><\/p>\n<h3 id=\"vybor-lidera\">Choix du leader<\/h3>\n<p><\/p>\n<p>Dans les syst\u00e8mes distribu\u00e9s, le choix d'un leader est la proc\u00e9dure d'attribution d'un seul processus responsable de la planification du traitement distribu\u00e9 d'une charge donn\u00e9e. <\/p>\n<p><\/p>\n<p>Dans les syst\u00e8mes peu enclins \u00e0 la centralisation, des algorithmes universels et des algorithmes bas\u00e9s sur le consensus, tels que paxos ou raft, sont utilis\u00e9s.<br \/>\n\u00c9tant donn\u00e9 que la messagerie est un courtier et un \u00e9l\u00e9ment central, elle conna\u00eet tous les contr\u00f4leurs de service - candidats au leadership. La messagerie peut d\u00e9signer un leader sans vote.<\/p>\n<p><\/p>\n<p>Tous les services, apr\u00e8s leur d\u00e9marrage et leur connexion au point d'\u00e9change, re\u00e7oivent un message syst\u00e8me <code>#'$leader'{exchange = ?EXCHANGE, pid = LeaderPid, servers = Servers}<\/code>. Dans le cas o\u00f9 <code>LeaderPid<\/code> co\u00efncide avec <code>pid<\/code> le processus actuel, il est d\u00e9sign\u00e9 comme leader, et la liste <code>Servers<\/code> comprend tous les n\u0153uds et leurs param\u00e8tres.<br \/>\nLorsqu'un nouveau n\u0153ud de cluster est ajout\u00e9 et qu'un n\u0153ud fonctionnel est d\u00e9sactiv\u00e9, tous les contr\u00f4leurs de service re\u00e7oivent <code>#'$slave_up'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> et <code>#'$slave_down'{exchange = ?EXCHANGE, pid = SlavePid, options = SlaveOpts}<\/code> respectivement.<\/p>\n<p><\/p>\n<p>Ainsi, tous les composants sont au courant de tous les changements, et dans le cluster, il y a toujours un leader assur\u00e9 \u00e0 tout moment.<\/p>\n<p><\/p>\n<h2 id=\"posredniki\">Interm\u00e9diaires<\/h2>\n<p><\/p>\n<p>Pour mettre en \u0153uvre des processus de traitement distribu\u00e9s complexes, ainsi que pour optimiser une architecture existante, il est pratique d'utiliser des interm\u00e9diaires.<br \/>\nPour ne pas modifier le code des services et r\u00e9soudre, par exemple, des t\u00e2ches de traitement suppl\u00e9mentaire, de routage ou de journalisation des messages, un gestionnaire proxy peut \u00eatre int\u00e9gr\u00e9 devant le service, qui effectuera tout le travail suppl\u00e9mentaire.<\/p>\n<p><\/p>\n<p>Un exemple classique d'optimisation pub-sub est une application distribu\u00e9e avec un noyau m\u00e9tier g\u00e9n\u00e9rant des \u00e9v\u00e9nements de mise \u00e0 jour, comme un changement de prix sur le march\u00e9, et une couche d'acc\u00e8s \u2014 N serveurs fournissant une API websocket pour les clients web.<br \/>\nSi l'on consid\u00e8re la situation de mani\u00e8re directe, le service client se d\u00e9roule comme suit :<\/p>\n<p><\/p>\n<ul>\n<li>le client \u00e9tablit une connexion avec la plateforme. Du c\u00f4t\u00e9 du serveur, qui termine le trafic, un processus est d\u00e9marr\u00e9 pour g\u00e9rer cette connexion.<\/li>\n<li>dans le contexte du processus de service, une autorisation et une inscription aux mises \u00e0 jour se produisent. Le processus appelle la m\u00e9thode subscribe pour les sujets.<\/li>\n<li>apr\u00e8s la g\u00e9n\u00e9ration de l'\u00e9v\u00e9nement dans le noyau, il est livr\u00e9 aux processus g\u00e9rant les connexions.<\/li>\n<\/ul>\n<p><\/p>\n<p>Imaginons que nous ayons 50000 abonn\u00e9s au sujet \"news\". Les abonn\u00e9s sont r\u00e9partis de mani\u00e8re uniforme sur 5 serveurs. En fin de compte, chaque mise \u00e0 jour, arriv\u00e9e \u00e0 un point d'\u00e9change, sera r\u00e9pliqu\u00e9e 50000 fois : 10000 fois sur chaque serveur, selon le nombre d'abonn\u00e9s sur celui-ci. Pas une m\u00e9thode tr\u00e8s efficace, n'est-ce pas ?<br \/>\nPour am\u00e9liorer la situation, introduisons un proxy qui a le m\u00eame nom que le point d'\u00e9change. Le registrateur de noms globaux doit \u00eatre capable de renvoyer le processus le plus proche par nom, c'est important.<\/p>\n<p><\/p>\n<p>Lan\u00e7ons ce proxy sur les serveurs de la couche d'acc\u00e8s, et tous nos processus g\u00e9rant l'API websocket s'abonneront \u00e0 lui, et non au point d'\u00e9change pub-sub d'origine dans le noyau. Le proxy s'abonne au noyau uniquement en cas d'abonnement unique et r\u00e9plique le message re\u00e7u \u00e0 tous ses abonn\u00e9s.<br \/>\nEn fin de compte, 5 messages seront transmis entre le noyau et les serveurs d'acc\u00e8s, au lieu de 50000.<\/p>\n<p><\/p>\n<h2 id=\"marshrutizaciya-i-balansirovka\">Routage et \u00e9quilibrage<\/h2>\n<p><\/p>\n<h3 id=\"req-resp\">Req-Resp<\/h3>\n<p><\/p>\n<p>Dans l'impl\u00e9mentation actuelle de la messagerie, il existe 7 strat\u00e9gies de r\u00e9partition des requ\u00eates :<\/p>\n<p><\/p>\n<ul>\n<li><code>default<\/code>. La demande est envoy\u00e9e \u00e0 tous les contr\u00f4leurs.<\/li>\n<li><code>round-robin<\/code>. Un parcours est effectu\u00e9 et les demandes sont distribu\u00e9es cycliquement entre les contr\u00f4leurs.<\/li>\n<li><code>consensus<\/code>. Les contr\u00f4leurs qui g\u00e8rent le service se divisent en un leader et des suiveurs. Les demandes sont uniquement envoy\u00e9es au leader.<\/li>\n<li><code>consensus &amp; round-robin<\/code>. Il y a un leader dans le groupe, mais les demandes sont r\u00e9parties entre tous les membres.<\/li>\n<li><code>sticky<\/code>. Une fonction de hachage est calcul\u00e9e et attach\u00e9e \u00e0 un gestionnaire sp\u00e9cifique. Les demandes suivantes avec cette signature vont \u00e0 ce m\u00eame gestionnaire.<\/li>\n<li><code>sticky-fun<\/code>. Lors de l'initialisation du point d'\u00e9change, une fonction de calcul de hachage est en outre fournie pour <code>sticky<\/code> l'\u00e9quilibrage.<\/li>\n<li><code>fun<\/code>. Semblable \u00e0 sticky-fun, mais permet \u00e9galement de rediriger, de rejeter ou de pr\u00e9traiter. <\/li>\n<\/ul>\n<p><\/p>\n<p>La strat\u00e9gie de distribution est d\u00e9finie lors de l'initialisation du point d'\u00e9change.<\/p>\n<p><\/p>\n<p>Outre l'\u00e9quilibrage, la messagerie permet de taguer les entit\u00e9s. Examinons les types de tags dans le syst\u00e8me :<\/p>\n<p><\/p>\n<ul>\n<li>Tag de connexion. Permet de comprendre par quelle connexion les \u00e9v\u00e9nements sont arriv\u00e9s. Utilis\u00e9 lorsque le processus du contr\u00f4leur se connecte \u00e0 un point d'\u00e9change unique, mais avec diff\u00e9rentes cl\u00e9s de routage. <\/li>\n<li>Tag de service. Permet de regrouper des gestionnaires pour un service et d'\u00e9largir les possibilit\u00e9s de routage et d'\u00e9quilibrage. Pour le mod\u00e8le req-resp, le routage est lin\u00e9aire. Nous envoyons une demande au point d'\u00e9change, puis elle la transmet au service. Mais si nous devons diviser les gestionnaires en groupes logiques, cela se fait \u00e0 l'aide de tags. Lorsqu'un tag est sp\u00e9cifi\u00e9, la demande sera dirig\u00e9e vers un groupe particulier de contr\u00f4leurs.<\/li>\n<li>Tag de demande. Permet de distinguer les r\u00e9ponses. \u00c9tant donn\u00e9 que notre syst\u00e8me est asynchrone, pour traiter les r\u00e9ponses du service, il est n\u00e9cessaire de sp\u00e9cifier RequestTag lors de l'envoi de la demande. Gr\u00e2ce \u00e0 cela, nous pourrons comprendre \u00e0 quelle demande la r\u00e9ponse re\u00e7ue correspond.<\/li>\n<\/ul>\n<p><\/p>\n<h3 id=\"pub-sub\">Pub-sub<\/h3>\n<p><\/p>\n<p>Pour le pub-sub, c'est un peu plus simple. Nous avons un point d'\u00e9change o\u00f9 les messages sont publi\u00e9s. Le point d'\u00e9change r\u00e9partit les messages entre les abonn\u00e9s qui se sont inscrits aux cl\u00e9s de routage qui les concernent (on peut dire que c'est l'analogue des sujets).<\/p>\n<p><\/p>\n<h2 id=\"masshtabiruemost-i-otkazoustoychivost\">Scalabilit\u00e9 et r\u00e9silience<\/h2>\n<p><\/p>\n<p>La scalabilit\u00e9 du syst\u00e8me dans son ensemble d\u00e9pend du degr\u00e9 de scalabilit\u00e9 des couches et des composants du syst\u00e8me :<\/p>\n<p><\/p>\n<ul>\n<li>Les services se d\u00e9veloppent en ajoutant des n\u0153uds suppl\u00e9mentaires avec des gestionnaires de ce service au cluster. Dans le cadre d'une exploitation exp\u00e9rimentale, il est possible de choisir la politique d'\u00e9quilibrage optimale.<\/li>\n<li>Le service de messagerie lui-m\u00eame, au sein d'un cluster distinct, se d\u00e9veloppe g\u00e9n\u00e9ralement soit en d\u00e9pla\u00e7ant des points d'\u00e9change particuli\u00e8rement charg\u00e9s vers des n\u0153uds s\u00e9par\u00e9s du cluster, soit en ajoutant des processus proxy dans les zones les plus sollicit\u00e9es du cluster.<\/li>\n<li>La scalabilit\u00e9 de l'ensemble du syst\u00e8me en tant que caract\u00e9ristique d\u00e9pend de la flexibilit\u00e9 de l'architecture et de la capacit\u00e9 \u00e0 unir des clusters distincts en une entit\u00e9 logique commune.<\/li>\n<\/ul>\n<p><\/p>\n<p>La simplicit\u00e9 et la rapidit\u00e9 de la scalabilit\u00e9 sont souvent d\u00e9terminantes pour le succ\u00e8s d'un projet. La messagerie, dans sa forme actuelle, cro\u00eet avec l'application. M\u00eame si nous manquons d'un cluster de 50 \u00e0 60 machines, nous pouvons recourir \u00e0 la f\u00e9d\u00e9ration. Malheureusement, la question de la f\u00e9d\u00e9ration d\u00e9passe le cadre de cet article.<\/p>\n<p><\/p>\n<h2 id=\"rezervirovanie\">Redondance<\/h2>\n<p><\/p>\n<p>Lors de l'examen de l'\u00e9quilibrage de la charge, nous avons d\u00e9j\u00e0 discut\u00e9 de la redondance des contr\u00f4leurs de services. Cependant, la messagerie doit \u00e9galement \u00eatre redond\u00e9e. En cas de d\u00e9faillance d'un n\u0153ud ou d'une machine, la messagerie doit se r\u00e9tablir automatiquement, et ce dans les plus brefs d\u00e9lais.<\/p>\n<p><\/p>\n<p>Dans mes projets, j'utilise des n\u0153uds suppl\u00e9mentaires qui prennent en charge la charge en cas de d\u00e9faillance. En Erlang, il existe une impl\u00e9mentation standard du mode distribu\u00e9 pour les applications OTP. Le mode distribu\u00e9 r\u00e9alise justement la r\u00e9cup\u00e9ration en cas de panne en lan\u00e7ant l'application tomb\u00e9e sur un autre n\u0153ud pr\u00e9alablement actif. Le processus est transparent, apr\u00e8s la panne, l'application est automatiquement transf\u00e9r\u00e9e sur le n\u0153ud de secours. Vous pouvez lire plus sur cette fonctionnalit\u00e9. <noindex><a rel=\"nofollow\" href=\"http:\/\/erlang.org\/doc\/design_principles\/distributed_applications.html\">ici<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h2 id=\"proizvoditelnost\">Performance<\/h2>\n<p><\/p>\n<p>Essayons d'au moins comparer approximativement les performances de rabbitmq et de notre messagerie personnalis\u00e9e.<br \/>\nJ'ai trouv\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openstack.org\/developer\/performance-docs\/test_results\/mq\/rabbitmq\/cmsm\/index.html\">les r\u00e9sultats officiels<\/a><\/noindex> des tests de rabbitmq par l'\u00e9quipe openstack.<\/p>\n<p><\/p>\n<p>Au point 6.14.1.2.1.2.2. du document original, le r\u00e9sultat du RPC CAST est pr\u00e9sent\u00e9 :<br \/>\n<img decoding=\"async\" alt=\"\u00c9l\u00e9ments constitutifs des applications distribu\u00e9es. Deuxi\u00e8me approche\" src=\"\/wp-content\/uploads\/2019\/04\/95f615d241d70a4523fe3c400179b8e6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pr\u00e9alablement, nous ne ferons aucune configuration suppl\u00e9mentaire dans le noyau OS ou l'ERLANG VM. Conditions de test :<\/p>\n<p><\/p>\n<ul>\n<li>erl opts: +A1 +sbtu.<\/li>\n<li>Le test sur un seul n\u0153ud Erlang est ex\u00e9cut\u00e9 sur un ordinateur portable avec un ancien i7 en version mobile.<\/li>\n<li>Les tests de cluster se d\u00e9roulent sur des serveurs avec un r\u00e9seau 10G.<\/li>\n<li>Le code fonctionne dans des conteneurs Docker. R\u00e9seau en mode NAT.<\/li>\n<\/ul>\n<p><\/p>\n<p>Code du 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>Sc\u00e9nario 1:<\/em> Le test est ex\u00e9cut\u00e9 sur un ordinateur portable avec un ancien i7 mobile. Le test, la messagerie et le service s'ex\u00e9cutent sur un seul n\u0153ud dans un m\u00eame conteneur Docker :<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Cycles s\u00e9quentiels de 10000 en ~0 secondes (26987 cycles\/s)\nCycles s\u00e9quentiels de 20000 en ~1 seconde (26915 cycles\/s)\nCycles s\u00e9quentiels de 100000 en ~4 secondes (26957 cycles\/s)\nParall\u00e8le 2 100000 cycles en ~2 secondes (44240 cycles\/s)\nParall\u00e8le 4 100000 cycles en ~2 secondes (53459 cycles\/s)\nParall\u00e8le 10 100000 cycles en ~2 secondes (52283 cycles\/s)\nParall\u00e8le 100 100000 cycles en ~3 secondes (49317 cycles\/s)<\/code><\/pre>\n<p><\/p>\n<p><em>Sc\u00e9nario 2<\/em>: 3 n\u0153uds lanc\u00e9s sur diff\u00e9rentes machines sous Docker (NAT).<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Cycles s\u00e9quentiels de 10000 en ~1 seconde (8684 cycles\/s)\nCycles s\u00e9quentiels de 20000 en ~2 secondes (8424 cycles\/s)\nCycles s\u00e9quentiels de 100000 en ~12 secondes (8655 cycles\/s)\nParall\u00e8le 2 100000 cycles en ~7 secondes (15160 cycles\/s)\nParall\u00e8le 4 100000 cycles en ~5 secondes (19133 cycles\/s)\nParall\u00e8le 10 100000 cycles en ~4 secondes (24399 cycles\/s)\nParall\u00e8le 100 100000 cycles en ~3 secondes (34517 cycles\/s)<\/code><\/pre>\n<p><\/p>\n<p>Dans tous les cas, l'utilisation du CPU n'a pas d\u00e9pass\u00e9 250%<\/p>\n<p><\/p>\n<h2 id=\"itogi\">R\u00e9sultats<\/h2>\n<p><\/p>\n<p>J'esp\u00e8re que ce cycle ne ressemble pas \u00e0 un d\u00e9versement de pens\u00e9es et que mon exp\u00e9rience sera r\u00e9ellement utile tant aux chercheurs en syst\u00e8mes distribu\u00e9s qu'aux praticiens qui commencent tout juste \u00e0 construire des architectures distribu\u00e9es pour leurs syst\u00e8mes d'entreprise et qui portent un int\u00e9r\u00eat \u00e0 Erlang\/Elixir, mais qui se demandent s'il vaut vraiment la peine de le faire...<\/p>\n<p><\/p>\n<p>Photo <noindex><a rel=\"nofollow\" href=\"https:\/\/unsplash.com\/photos\/Q4bmoSPJM18\">@chuttersnap<\/a><\/noindex><\/p>\n<p class=\"for_users_only_msg\">Seuls les utilisateurs enregistr\u00e9s peuvent participer au sondage. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Connectez-vous<\/a><\/noindex>, s'il vous pla\u00eet.<\/p>\n<h2 class=\"default-block__polling-title\">Quels sujets devrais-je couvrir plus en d\u00e9tail dans le cadre du cycle \u00ab Exp\u00e9rience VTrade \u00bb ?<\/h2>\n<ul class=\"content-list content-list_polling\">\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Th\u00e9orie : March\u00e9s, ordres et dur\u00e9e de leur validit\u00e9 : DAY, GTD, GTC, IOC, FOK, MOO, MOC, LOO, LOC<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Livre d'ordres. Th\u00e9orie et pratique de la r\u00e9alisation d'un livre avec des regroupements<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Visualisation des \u00e9changes : Tick, barres, r\u00e9solutions. Comment stocker et comment assembler<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Back-office. Planification et d\u00e9veloppement. Contr\u00f4le des employ\u00e9s et enqu\u00eate sur les incidents<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    API. Analysons quels interfaces sont n\u00e9cessaires et comment les mettre en \u0153uvre<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Stockage des informations : PostgreSQL, Timescale, Tarantool dans les syst\u00e8mes de trading<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    R\u00e9activit\u00e9 dans les syst\u00e8mes de trading<\/p>\n<\/li>\n<li class=\"content-list__item content-list__item_polling\">\n<p>                    Autre. J'\u00e9crirai dans les commentaires<\/p>\n<\/li>\n<\/ul>\n<p>    6 utilisateurs ont vot\u00e9. 4 utilisateurs se sont abstenus.<br \/>\n<br \/>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Blocs de construction d'applications distribu\u00e9es. Deuxi\u00e8me approximation | ProHoster","description":"Annonce Coll\u00e8gues, au milieu de l'\u00e9t\u00e9, je pr\u00e9vois de publier un autre cycle d'articles sur la conception de syst\u00e8mes de service de masse : \u00ab Exp\u00e9rience VTrade \u00bb \u2014 une tentative d'\u00e9crire un framework pour le trading.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/stroitelnye-bloki-raspredelennyh-prilozhenij-vtoroe-priblizhenie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/31124","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=31124"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/31124\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/23092"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=31124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=31124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=31124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}