{"id":95804,"date":"2020-10-03T13:42:27","date_gmt":"2020-10-03T11:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit"},"modified":"2020-10-03T13:42:27","modified_gmt":"2020-10-03T11:42:27","slug":"istoriya-arhitektury-dodo-is-rannij-monolit","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","title":{"rendered":"L'histoire de l'architecture Dodo IS : une premi\u00e8re monolithique","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ou chaque entreprise malheureuse avec un monolithe est malheureuse \u00e0 sa fa\u00e7on.<\/p>\n<p>Le d\u00e9veloppement du syst\u00e8me Dodo IS a commenc\u00e9 simultan\u00e9ment avec l'entreprise Dodo Pizza \u2014 en 2011. Au c\u0153ur se trouvait l'id\u00e9e d'une num\u00e9risation compl\u00e8te et totale des processus commerciaux, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/08\/30\/sobstvennaya-sistema\/\"><u>par ses propres moyens<\/u><\/a><\/noindex>, ce qui, d\u00e9j\u00e0 en 2011, soulevait de nombreuses questions et du scepticisme. Mais voil\u00e0, cela fait 9 ans que nous avan\u00e7ons sur ce chemin \u2014 avec un d\u00e9veloppement propre, qui a commenc\u00e9 par un monolithe.<\/p>\n<p>Cet article est une \u00ab r\u00e9ponse \u00bb aux questions \u00ab Pourquoi r\u00e9\u00e9crire l'architecture et apporter de tels changements massifs et longs ? \u00bb \u00e0 l'article pr\u00e9c\u00e9dent <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/506136\/\"><u>\u00ab Histoire de l'architecture Dodo IS : le parcours du back-office \u00bb<\/u><\/a><\/noindex>. Je vais commencer par expliquer comment le d\u00e9veloppement de Dodo IS a \u00e9t\u00e9 lanc\u00e9, \u00e0 quoi ressemblait l'architecture initiale, comment de nouveaux modules apparaissaient et pour quelles raisons il a fallu effectuer des modifications majeures.<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/881fe068f46f934dc9730a5946996da3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<blockquote>\n<p><strong>La s\u00e9rie d'articles \u00ab Qu'est-ce que Dodo IS ? \u00bb parlera de :<\/strong><\/p>\n<\/blockquote>\n<ol>\n<li>\n<p>Le monolithe pr\u00e9coce dans Dodo IS (2011-2015). (Vous \u00eates ici)<\/p>\n<\/li>\n<li>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/506136\/\">Le parcours du back-office : des bases s\u00e9par\u00e9es et un bus<\/a><\/noindex>.<\/p>\n<\/li>\n<li>\n<p>Le parcours de la partie client : un facade au-dessus de la base (2016-2017). (En cours\u2026)<\/p>\n<\/li>\n<li>\n<p>L'histoire des v\u00e9ritables microservices. (2018-2019). (En cours\u2026)<\/p>\n<\/li>\n<li>\n<p>La d\u00e9coupe finie du monolithe et la stabilisation de l'architecture. (En cours\u2026)<\/p>\n<\/li>\n<\/ol>\n<h3>L'architecture initiale<\/h3>\n<p>En 2011, l'architecture Dodo IS ressemblait \u00e0 ceci :<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/93814518ca50678933f2591749e3e489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Le premier module de l'architecture \u2014 la prise de commande. Le processus commercial \u00e9tait le suivant :<\/p>\n<ul>\n<li>\n<p>le client appelle la pizzeria ;<\/p>\n<\/li>\n<li>\n<p>le manager r\u00e9pond au t\u00e9l\u00e9phone ;<\/p>\n<\/li>\n<li>\n<p>il prend la commande par t\u00e9l\u00e9phone ;<\/p>\n<\/li>\n<li>\n<p>parall\u00e8lement, il la saisit dans l'interface de prise de commande : les informations sur le client, les d\u00e9tails de la commande, l'adresse de livraison sont prises en compte.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>L'interface du syst\u00e8me d'information ressemblait \u00e0 peu pr\u00e8s \u00e0 \u00e7a\u2026<\/p>\n<p>La premi\u00e8re version d'octobre 2011 :<\/p>\n<p><center><iframe loading=\"lazy\" width=\"560\" height=\"315\" src=\"https:\/\/embedd.srv.habr.com\/iframe\/5f75cfa9779ba700bea78afc\" frameborder=\"0\" allowfullscreen><\/iframe><\/center>L\u00e9g\u00e8rement am\u00e9lior\u00e9e en janvier 2012<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/youtu.be\/h2Cdht01gDA\">Syst\u00e8me d'information Dodo Pizza Restaurant de Livraison<\/a><\/noindex><\/p>\n<p>Les ressources pour le d\u00e9veloppement du premier module de prise de commande \u00e9taient limit\u00e9es. Il fallait faire beaucoup, rapidement, avec peu de personnel. Peu de personnel \u2014 c'est 2 d\u00e9veloppeurs qui ont pos\u00e9 les bases de tout le syst\u00e8me futur.<\/p>\n<p>Leur premi\u00e8re solution a d\u00e9termin\u00e9 le sort ult\u00e9rieur de la pile technologique :<\/p>\n<ul>\n<li>\n<p>Backend sur ASP.NET MVC, langage C#. Les d\u00e9veloppeurs \u00e9taient des dotnetters, cette pile leur \u00e9tait famili\u00e8re et agr\u00e9able. <\/p>\n<\/li>\n<li>\n<p>Frontend sur Bootstrap et JQuery : interfaces utilisateur avec des styles et des scripts personnalis\u00e9s.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Base de donn\u00e9es MySQL : sans frais de licence, facile \u00e0 utiliser.<\/p>\n<\/li>\n<li>\n<p>Serveurs sous Windows Server, car .NET ne pouvait alors fonctionner que sous Windows (nous ne parlerons pas de Mono).<\/p>\n<\/li>\n<\/ul>\n<p>Physiquement, cela se traduit par un \u00ab d\u00e9di\u00e9 chez l'h\u00e9bergeur \u00bb.&nbsp;<\/p>\n<h4>Architecture de l'application de traitement des commandes<\/h4>\n<p>\u00c0 cette \u00e9poque, tout le monde parlait d\u00e9j\u00e0 de microservices, et le SOA \u00e9tait utilis\u00e9 pendant environ 5 ans dans des projets majeurs, par exemple, WCF est sorti en 2006. Mais \u00e0 l'\u00e9poque, une solution fiable et \u00e9prouv\u00e9e a \u00e9t\u00e9 choisie.<\/p>\n<p>Voici.<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/688da7d4e02a6310bf7d2da1b767fe10.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Asp.Net MVC est un Razor qui g\u00e9n\u00e8re, \u00e0 la demande depuis un formulaire ou un client, une page HTML avec un rendu c\u00f4t\u00e9 serveur. C\u00f4t\u00e9 client, CSS et scripts JS affichent les informations et, si n\u00e9cessaire, ex\u00e9cutent des requ\u00eates AJAX via JQuery.<\/p>\n<p>Les requ\u00eates sur le serveur sont trait\u00e9es dans des classes *Controller, o\u00f9 la m\u00e9thode effectue le traitement et la g\u00e9n\u00e9ration de la page HTML finale. Les contr\u00f4leurs effectuent des requ\u00eates vers une couche de logique, appel\u00e9e *Services. Chacun des services \u00e9tait responsable d'un aspect de l'entreprise :<\/p>\n<ul>\n<li>\n<p>Par exemple, DepartmentStructureService fournissait des informations sur les pizzerias, selon les d\u00e9partements. Un d\u00e9partement est un groupe de pizzerias sous la gestion d'un franchis\u00e9.<\/p>\n<\/li>\n<li>\n<p>ReceivingOrdersService acceptait et calculait la composition de la commande.<\/p>\n<\/li>\n<li>\n<p>Et SmsService envoyait des SMS en appelant des services d'API pour l'envoi de SMS.<\/p>\n<\/li>\n<\/ul>\n<p>Les services traitaient les donn\u00e9es de la base, stockaient la logique m\u00e9tier. Chaque service avait un ou plusieurs *Repository avec le nom appropri\u00e9. Ils contenaient d\u00e9j\u00e0 des requ\u00eates aux proc\u00e9dures stock\u00e9es dans la base de donn\u00e9es et une couche de mappers. La logique m\u00e9tier se trouvait principalement dans les proc\u00e9dures stock\u00e9es, surtout celles qui g\u00e9n\u00e9raient des donn\u00e9es de rapport. L'ORM n'\u00e9tait pas utilis\u00e9, tout le monde s'appuyait sur des SQL \u00e9crits \u00e0 la main.&nbsp;<\/p>\n<p>Il y avait aussi une couche de mod\u00e8le de domaine et des classes utilitaires g\u00e9n\u00e9rales, par exemple, la classe Order qui stockait la commande. L\u00e0, dans la couche, se trouvait un helper pour transformer le texte d'affichage selon la devise choisie.<\/p>\n<p>Tout cela peut \u00eatre repr\u00e9sent\u00e9 par le mod\u00e8le suivant : <\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/ff76833cfd19e778bc6ad33589fc328b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h4>Parcours de commande<\/h4>\n<p>Consid\u00e9rons le parcours simplifi\u00e9 de la cr\u00e9ation d'une telle commande.<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/da7334d6e6258b800618287de6e1d393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u00c0 l'origine, le site \u00e9tait statique. Il contenait des prix, et en haut figurait un num\u00e9ro de t\u00e9l\u00e9phone avec une inscription \u00ab Vous voulez une pizza ? Appelez au num\u00e9ro et commandez \u00bb. Pour passer la commande, nous devions mettre en place un simple flux :&nbsp;<\/p>\n<ul>\n<li>\n<p>Le client entre sur le site statique avec les prix, choisit des produits et appelle le num\u00e9ro indiqu\u00e9 sur le site.<\/p>\n<\/li>\n<li>\n<p>Le client \u00e9nonce les produits qu'il souhaite ajouter \u00e0 la commande.<\/p>\n<\/li>\n<li>\n<p>Il donne son adresse et son nom.<\/p>\n<\/li>\n<li>\n<p>L'op\u00e9rateur prend la commande.<\/p>\n<\/li>\n<li>\n<p>La commande s'affiche dans l'interface des commandes re\u00e7ues.<\/p>\n<\/li>\n<\/ul>\n<p>Tout commence par l'affichage du menu. Un utilisateur op\u00e9rateur connect\u00e9 ne peut prendre qu'une seule commande \u00e0 la fois. C'est pourquoi le panier draft peut \u00eatre conserv\u00e9 dans sa session (la session de l'utilisateur est conserv\u00e9e en m\u00e9moire). Il contient un objet Cart, o\u00f9 se trouvent les produits et les informations sur le client.<\/p>\n<p>Le client mentionne le produit, l'op\u00e9rateur clique sur <code>+<\/code> \u00e0 c\u00f4t\u00e9 du produit, et une requ\u00eate est envoy\u00e9e au serveur. Les informations sur le produit sont extraites de la base de donn\u00e9es et ajout\u00e9es au panier.<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/e481d7a5865efc1d37574225c6a0b89e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><strong>Remarque<\/strong>. Oui, ici il est possible de ne pas extraire le produit de la base, mais de le transmettre depuis le frontend. Mais pour la clart\u00e9, j'ai montr\u00e9 le chemin depuis la base.&nbsp;<\/p>\n<p>Ensuite, nous saisissons l'adresse et le nom du client.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/c40e29108a308015522cf219b6d7a515.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En cliquant sur \u00ab Cr\u00e9er une commande \u00bb :<\/p>\n<ul>\n<li>\n<p>La requ\u00eate est envoy\u00e9e \u00e0 OrderController.SaveOrder().<\/p>\n<\/li>\n<li>\n<p>Nous r\u00e9cup\u00e9rons le Cart de la session, o\u00f9 se trouvent les produits dans la quantit\u00e9 souhait\u00e9e.<\/p>\n<\/li>\n<li>\n<p>Nous compl\u00e9tons le Cart avec les informations sur le client et les transmettons \u00e0 la m\u00e9thode AddOrder de la classe ReceivingOrderService, o\u00f9 elles sont enregistr\u00e9es dans la base.&nbsp;<\/p>\n<\/li>\n<li>\n<p>Il existe des tables dans la base pour la commande, le contenu de la commande et le client, et elles sont toutes li\u00e9es.<\/p>\n<\/li>\n<li>\n<p>L'interface d'affichage de la commande se met \u00e0 jour et extrait les derni\u00e8res commandes et les affiche.<\/p>\n<\/li>\n<\/ul>\n<h4>Nouveaux modules<\/h4>\n<p>\u041f\u0440\u0438\u0435\u043c \u0437\u0430\u043a\u0430\u0437\u0430 \u0431\u044b\u043b \u0432\u0430\u0436\u0435\u043d \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c. \u041d\u0435\u043b\u044c\u0437\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u0438\u0437\u043d\u0435\u0441 \u043f\u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0435 \u043f\u0438\u0446\u0446\u044b, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043f\u0440\u0438\u0435\u043c\u0430 \u0437\u0430\u043a\u0430\u0437\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0430\u0436\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u0440\u0430\u0441\u0442\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u043e\u043c \u2014&nbsp;\u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441 2012 \u043f\u043e 2015 \u0433\u043e\u0434\u0430. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0431\u0443\u0434\u0443 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c <strong>modules<\/strong>, contrairement au concept de service ou de produit.&nbsp;<\/p>\n<p>Un module est un ensemble de fonctions regroup\u00e9es autour d'un objectif commercial commun. Ils se trouvent physiquement dans une m\u00eame application.<\/p>\n<p>Les modules peuvent \u00eatre consid\u00e9r\u00e9s comme des blocs du syst\u00e8me. Par exemple, c'est le module de rapports, les interfaces d'administration, <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2011\/10\/20\/treking-zakazov\/\"><u>le tracker de produits en cuisine<\/u><\/a><\/noindex>, l'autorisation. Ce sont tous des interfaces diff\u00e9rentes pour les utilisateurs, certaines ayant m\u00eame des styles visuels vari\u00e9s. Tout cela se fait dans le cadre d'une seule application, d'un m\u00eame processus fonctionnel.&nbsp;<\/p>\n<p>Techniquement, les modules \u00e9taient formalis\u00e9s comme des Areas (cette id\u00e9e persiste m\u00eame dans <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/mvc\/controllers\/areas?view=aspnetcore-3.1\"><u>asp.net core<\/u><\/a><\/noindex>). \u0422\u0430\u043c \u0431\u044b\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430, \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0438 \u043a\u043b\u0430\u0441\u0441\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0438\u0437 \u0442\u0430\u043a\u043e\u0439&#8230;<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/cac789e252e0df13718adbc694c31596.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026en ceci :<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/6c75b61b33488edbb0427e87dee14189.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Certains modules sont des sites distincts (projet ex\u00e9cutable), en raison d'un ensemble de fonctionnalit\u00e9s totalement distinctes et partiellement \u00e0 cause d'un d\u00e9veloppement plus cibl\u00e9. Ce sont :<\/p>\n<ul>\n<li>\n<p><strong>Site<\/strong> \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/sila-uma.ru\/2013\/08\/06\/new_site_dodopizza_ru\/\"><u>la premi\u00e8re version<\/u><\/a><\/noindex> du site dodopizza.ru.<\/p>\n<\/li>\n<li>\n<p><strong>Exporter<\/strong>: exportation des rapports de Dodo IS pour 1C.&nbsp;<\/p>\n<\/li>\n<li>\n<p><strong>Personnel<\/strong> \u2014 espace personnel de l'employ\u00e9. D\u00e9velopp\u00e9 s\u00e9par\u00e9ment avec son propre point d'entr\u00e9e et un design distinct.<\/p>\n<\/li>\n<li>\n<p><strong>fs<\/strong> \u2014 projet pour l'h\u00e9bergement de statiques. Nous nous en sommes ensuite \u00e9loign\u00e9s en transf\u00e9rant toute la statique vers CDN Akamai.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Les autres blocs se trouvaient dans l'application BackOffice.&nbsp;<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/c48e67beca3937a2e6e2df78834fd05d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Explication des noms :<\/p>\n<ul>\n<li>\n<p>Caissier \u2014 Caisse du restaurant.<\/p>\n<\/li>\n<li>\n<p>ShiftManager \u2014 interfaces pour le r\u00f4le de \u00ab Manager de service \u00bb : statistiques op\u00e9rationnelles sur les ventes de la pizzeria, possibilit\u00e9 de mettre des produits sur liste noire, modifier les commandes.<\/p>\n<\/li>\n<li>\n<p>OfficeManager \u2014 interfaces pour le r\u00f4le de \u00ab G\u00e9rant de pizzeria \u00bb et \u00ab Franchis\u00e9 \u00bb. Recueille des fonctions pour configurer la pizzeria, ses promotions, la gestion des employ\u00e9s, et les rapports.<\/p>\n<\/li>\n<li>\n<p>PublicScreens \u2014 interfaces pour les t\u00e9l\u00e9viseurs et tablettes suspendus dans les pizzerias. Les t\u00e9l\u00e9viseurs affichent le menu, des informations publicitaires, le statut de la commande lors de la remise.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Ils ont utilis\u00e9 une couche de services commune, un bloc commun de classes de domaine Dodo.Core, ainsi qu'une base de donn\u00e9es partag\u00e9e. Parfois, il y avait \u00e9galement des r\u00e9f\u00e9rences mutuelles. Y compris certains sites, comme dodopizza.ru ou personal.dodopizza.ru, acc\u00e9daient aux services communs.<\/p>\n<p>Lors de l'apparition de nouveaux modules, ils ont essay\u00e9 de r\u00e9utiliser au maximum le code des services, des proc\u00e9dures stock\u00e9es et des tables d\u00e9j\u00e0 cr\u00e9\u00e9s dans la base.&nbsp;<\/p>\n<p>Pour mieux comprendre l'ampleur des modules d\u00e9velopp\u00e9s dans le syst\u00e8me, voici un sch\u00e9ma de 2012 avec les plans de d\u00e9veloppement :<\/p>\n<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/57bf3e8be415ed9ae38abb976f7a5393.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>D'ici 2015, tout ce qui \u00e9tait sur le sch\u00e9ma et m\u00eame plus \u00e9tait en production.<\/p>\n<ul>\n<li>\n<p>La prise de commande s'est transform\u00e9e en un bloc s\u00e9par\u00e9 du Centre de Contact, o\u00f9 les commandes sont prises par un op\u00e9rateur.<\/p>\n<\/li>\n<li>\n<p>Des \u00e9crans publics avec le menu et des informations sont apparus, suspendus dans les pizzerias.<\/p>\n<\/li>\n<li>\n<p>En cuisine, il y a un module qui reproduit automatiquement le message vocal \u00ab Nouvelle pizza \u00bb lors de la r\u00e9ception d'une nouvelle commande, et imprime \u00e9galement un bon de livraison pour le livreur. Cela simplifie consid\u00e9rablement les processus en cuisine, permettant aux employ\u00e9s de ne pas \u00eatre distraits par un grand nombre d'op\u00e9rations simples.<\/p>\n<\/li>\n<li>\n<p>Le bloc de livraison est devenu une Caisse de Livraison distincte, o\u00f9 la commande \u00e9tait remise au livreur qui s'\u00e9tait pr\u00e9alablement inscrit pour son service. Son temps de travail \u00e9tait pris en compte pour le calcul de son salaire.&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>Parall\u00e8lement, de 2012 \u00e0 2015, plus de 10 d\u00e9veloppeurs sont apparus, 35 pizzerias ont ouvert, un syst\u00e8me a \u00e9t\u00e9 d\u00e9ploy\u00e9 en Roumanie et des sites ont \u00e9t\u00e9 pr\u00e9par\u00e9s aux \u00c9tats-Unis. Les d\u00e9veloppeurs ne s'occupaient plus de toutes les t\u00e2ches, mais \u00e9taient r\u00e9partis en \u00e9quipes, chacune se sp\u00e9cialisant dans une partie du syst\u00e8me.&nbsp;<\/p>\n<h3>Probl\u00e8mes<\/h3>\n<p>Ceci en partie en raison de l'architecture (mais pas seulement).<\/p>\n<h4>Chaos dans la base<\/h4>\n<p>Une base \u2014 c'est pratique. On peut atteindre la coh\u00e9rence, gr\u00e2ce \u00e0 des moyens int\u00e9gr\u00e9s dans les bases de donn\u00e9es relationnelles. Travailler avec elle est habituel et facile, surtout si elle contient peu de tables et peu de donn\u00e9es.<\/p>\n<p>Mais au bout de 4 ans de d\u00e9veloppement, la base comptait environ 600 tables, 1500 proc\u00e9dures stock\u00e9es, dont beaucoup contenaient encore de la logique. Malheureusement, les proc\u00e9dures stock\u00e9es n'apportent pas d'avantage particulier lorsqu'on travaille avec MySQL. Elles ne sont pas mises en cache par la base, et l'int\u00e9gration de la logique complique le d\u00e9veloppement et le d\u00e9bogage. La r\u00e9utilisation du code est \u00e9galement probl\u00e9matique.<\/p>\n<p><strong>De nombreuses tables n'avaient pas d'index appropri\u00e9s.<\/strong>, tandis que d'autres, au contraire, avaient un tr\u00e8s grand nombre d'index, ce qui compliquait l'insertion. Il a fallu modifier environ 20 tables \u2014 la transaction de cr\u00e9ation de commande pouvait prendre entre 3 et 5 secondes.&nbsp;<\/p>\n<p><strong>Les donn\u00e9es dans les tables n'\u00e9taient pas toujours sous la forme la plus appropri\u00e9e.<\/strong>. Parfois, il \u00e9tait n\u00e9cessaire de proc\u00e9der \u00e0 une d\u00e9normalisation. Une partie des donn\u00e9es r\u00e9guli\u00e8rement re\u00e7ues \u00e9tait dans une colonne sous forme de structure XML, ce qui augmentait le temps d'ex\u00e9cution, allongeait les requ\u00eates et compliquait le d\u00e9veloppement.<\/p>\n<p>Des requ\u00eates tr\u00e8s <strong>vari\u00e9es \u00e9taient effectu\u00e9es sur les m\u00eames tables.<\/strong>. Les tables populaires, comme celle mentionn\u00e9e <em>orders<\/em> ou la table <em>pizzeria<\/em>, en souffraient particuli\u00e8rement. Elles \u00e9taient utilis\u00e9es pour afficher des interfaces op\u00e9rationnelles en cuisine, pour l'analyse. Le site<noindex><a rel=\"nofollow\" href=\"https:\/\/dodopizza.ru\/\"><u>dodopizza.ru<\/u><\/a><\/noindex>y acc\u00e9dait \u00e9galement, avec un grand nombre de requ\u00eates pouvant arriver \u00e0 tout moment.&nbsp;<\/p>\n<p><strong>Les donn\u00e9es n'\u00e9taient pas agr\u00e9g\u00e9es<\/strong> et beaucoup de calculs se faisaient \u00e0 la vol\u00e9e avec les moyens de la base. Cela engendrait des calculs suppl\u00e9mentaires et une charge suppl\u00e9mentaire.&nbsp;<\/p>\n<p>Souvent, le code acc\u00e9dait \u00e0 la base alors qu'il aurait pu s'en passer. Parfois, il manquait des op\u00e9rations en masse, parfois il aurait fallu r\u00e9partir une requ\u00eate en plusieurs via le code pour acc\u00e9l\u00e9ra et am\u00e9liorer la fiabilit\u00e9.&nbsp;<\/p>\n<h4>Coh\u00e9sion et embrouillamin dans le code<\/h4>\n<p><strong>Les modules qui auraient d\u00fb r\u00e9pondre \u00e0 leur secteur d'activit\u00e9 ne le faisaient pas correctement.<\/strong>. Certains d'entre eux avaient des duplications dans les fonctionnalit\u00e9s des r\u00f4les. Par exemple, le marketeur local, charg\u00e9 de l'activit\u00e9 marketing du r\u00e9seau dans sa ville, devait utiliser \u00e0 la fois l'interface \u00ab Admin \u00bb (pour cr\u00e9er des promotions) et l'interface \u00ab Manager de Bureau \u00bb (pour visualiser l'impact des promotions sur les affaires). Bien s\u00fbr, les deux modules utilisaient en interne le m\u00eame service qui g\u00e9rait les promotions bonus.<\/p>\n<p>Les services (classes au sein d'un m\u00eame projet monolithique) pouvaient s'appeler mutuellement pour enrichir leurs donn\u00e9es.<\/p>\n<p>Avec les classes-mod\u00e8les qui stockent les donn\u00e9es, <strong>le travail dans le code \u00e9tait vari\u00e9<\/strong>. Parfois, il y avait des constructeurs permettant d'indiquer les champs obligatoires. D'autres fois, cela se faisait via des propri\u00e9t\u00e9s publiques. Bien s\u00fbr, l'obtention et la transformation des donn\u00e9es de la base \u00e9taient diversifi\u00e9es.&nbsp;<\/p>\n<p><strong>La logique r\u00e9sidait soit dans les contr\u00f4leurs, soit dans les classes de services.<\/strong>&nbsp;<\/p>\n<p>Ce sont des probl\u00e8mes apparemment insignifiants, mais ils ralentissaient fortement le d\u00e9veloppement et diminuaient la qualit\u00e9, entra\u00eenant instabilit\u00e9 et erreurs.&nbsp;<\/p>\n<h4>La complexit\u00e9 d'un grand d\u00e9veloppement<\/h4>\n<p><strong>Des difficult\u00e9s sont \u00e9galement survenues dans le d\u00e9veloppement m\u00eame<\/strong>. Il fallait cr\u00e9er diff\u00e9rentes parties du syst\u00e8me en parall\u00e8le. Satisfaire les besoins de chaque composant dans un code unifi\u00e9 devenait de plus en plus difficile. Il n'\u00e9tait pas simple de parvenir \u00e0 un accord et de satisfaire tous les composants en m\u00eame temps. \u00c0 cela s'ajoutaient des limitations en mati\u00e8re de technologies, notamment concernant la base de donn\u00e9es et le front-end. Il fallait abandonner jQuery en faveur de frameworks de haut niveau, surtout pour les services client (site web).<\/p>\n<p><strong>Dans certaines parties du syst\u00e8me, des bases de donn\u00e9es plus adapt\u00e9es auraient pu \u00eatre utilis\u00e9es<\/strong>. Par exemple, nous avons par la suite eu un pr\u00e9c\u00e9dent de migration de Redis vers CosmosDB pour le stockage du panier de commande.&nbsp;<\/p>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0432\u043e\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u044c\u044e \u044f\u0432\u043d\u043e \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043a\u0430\u043a \u0432 \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0442\u0430\u043a \u0438 \u0432 \u0447\u0430\u0441\u0442\u0438 \u0432\u044b\u043a\u0430\u0442\u043a\u0438. \u041a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u044b \u043f\u0440\u0438 \u043c\u0435\u0440\u0436\u0435, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u0440\u0435\u043b\u0438\u0437\u0430\u0445. \u0415\u0441\u043b\u0438 \u0434\u043b\u044f 5 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u0430, \u0442\u043e \u043f\u0440\u0438 10, \u0430 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435&nbsp; \u043f\u0440\u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u043c \u0440\u043e\u0441\u0442\u0435, \u0432\u0441\u0435 \u0441\u0442\u0430\u043b\u043e \u0431\u044b \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u0435\u0435. \u0410 \u0430 \u0432\u043f\u0435\u0440\u0435\u0434\u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043e\u043d\u0430 \u0441\u0442\u0430\u0440\u0442\u0430\u043d\u0443\u043b\u0430 \u0432 2017, \u0430 \u0432 2018 \u0431\u044b\u043b\u043e <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/498280\/\">une forte chute<\/a><\/noindex>).&nbsp;<\/p>\n<p><strong>Diff\u00e9rentes parties du syst\u00e8me n\u00e9cessitaient diff\u00e9rents niveaux de stabilit\u00e9.<\/strong>, mais en raison de la forte interconnexion du syst\u00e8me, nous n'avons pas pu garantir cela. Une erreur lors du d\u00e9veloppement d'une nouvelle fonctionnalit\u00e9 dans l'interface d'administration a pu se r\u00e9percuter sur le processus de commande sur le site, car le code est commun et r\u00e9utilis\u00e9, tout comme la base de donn\u00e9es et les donn\u00e9es.<\/p>\n<p>Il aurait probablement \u00e9t\u00e9 possible de ne pas permettre ces erreurs et ces probl\u00e8mes dans le cadre d'une architecture modulaire monolithique : en s\u00e9parant les responsabilit\u00e9s, en effectuant le refactoring tant du code que de la base de donn\u00e9es, en distinguant clairement les couches, et en surveillant la qualit\u00e9 chaque jour. Cependant, les choix architecturaux effectu\u00e9s et l'accent mis sur l'expansion rapide des fonctionnalit\u00e9s du syst\u00e8me ont conduit \u00e0 des probl\u00e8mes de stabilit\u00e9.<\/p>\n<h4>Comment le blog La force de l'esprit a affect\u00e9 les caisses dans les restaurants<\/h4>\n<p>Si la croissance du r\u00e9seau de pizzerias (et la charge) avait continu\u00e9 au m\u00eame rythme, il aurait bient\u00f4t \u00e9t\u00e9 si difficile de g\u00e9rer les baisses que le syst\u00e8me ne pourrait pas se r\u00e9tablir. Une histoire illustre bien les probl\u00e8mes que nous avons commenc\u00e9 \u00e0 rencontrer en 2015.&nbsp;<\/p>\n<p>Dans le blog \u00ab<noindex><a rel=\"nofollow\" href=\"http:\/\/sila-uma.ru\/\"><u>La force de l'esprit<\/u><\/a><\/noindex>\u00bb, il y avait un widget qui affichait les donn\u00e9es de revenus annuels pour l'ensemble du r\u00e9seau. Le widget se connectait \u00e0 l'API publique de Dodo, qui fournit ces donn\u00e9es. Cette statistique est d\u00e9sormais disponible sur <noindex><a rel=\"nofollow\" href=\"http:\/\/dodopizzastory.com\/\"><u>http:\/\/dodopizzastory.com\/<\/u><\/a><\/noindex>. Le widget s'affichait sur chaque page et faisait des requ\u00eates toutes les 20 secondes. La requ\u00eate \u00e9tait envoy\u00e9e \u00e0 api.dodopizza.ru et demandait :<\/p>\n<ul>\n<li>\n<p>le nombre de pizzerias dans le r\u00e9seau ;<\/p>\n<\/li>\n<li>\n<p>le revenu total du r\u00e9seau depuis le d\u00e9but de l'ann\u00e9e ;<\/p>\n<\/li>\n<li>\n<p>le revenu d'aujourd'hui.<\/p>\n<\/li>\n<\/ul>\n<p>La requ\u00eate sur la statistique des revenus allait directement \u00e0 la base de donn\u00e9es et commen\u00e7ait \u00e0 interroger les donn\u00e9es des commandes, \u00e0 agr\u00e9ger les informations \u00e0 la vol\u00e9e et \u00e0 fournir le montant.&nbsp;<\/p>\n<p>Dans cette m\u00eame table des commandes, les caisses des restaurants importaient la liste des commandes re\u00e7ues pour aujourd'hui, et de nouvelles commandes y \u00e9taient \u00e9galement ajout\u00e9es. Les caisses faisaient leurs requ\u00eates toutes les 5 secondes ou lors du rechargement de la page.<\/p>\n<p>Le sch\u00e9ma \u00e9tait le suivant :<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/9f39d8c412c64e6aa40a0d5170a8cc0e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Un jour d'automne, F\u00e9dor Ovtchinnikov a \u00e9crit un long et populaire article sur son blog. Le blog a attir\u00e9 de nombreuses personnes qui ont commenc\u00e9 \u00e0 lire attentivement. Pendant que chaque visiteur lisait l'article, le widget de revenus fonctionnait correctement et faisait des requ\u00eates \u00e0 l'API toutes les 20 secondes.<\/p>\n<p>L'API a appel\u00e9 une proc\u00e9dure stock\u00e9e pour calculer le montant total de toutes les commandes depuis le d\u00e9but de l'ann\u00e9e dans l'ensemble du r\u00e9seau de pizzerias. L'agr\u00e9gation se faisait \u00e0 partir de la table des commandes, qui est tr\u00e8s populaire. Toutes les caisses de tous les restaurants ouverts \u00e0 ce moment y acc\u00e9daient. Les caisses ont cess\u00e9 de r\u00e9pondre, les commandes n'\u00e9taient plus prises en compte. De plus, elles n'\u00e9taient pas prises en charge depuis le site, n'apparaissaient pas sur le suiveur, le responsable de quart ne pouvait pas les voir dans son interface.&nbsp;<\/p>\n<p>Ce n'est pas la seule histoire. \u00c0 l'automne 2015, la charge sur le syst\u00e8me \u00e9tait critique chaque vendredi. Nous avons d\u00e9sactiv\u00e9 plusieurs fois l'API publique, et une fois, nous avons m\u00eame d\u00fb d\u00e9sactiver le site, car rien ne fonctionnait plus. Il y avait m\u00eame une liste de services avec un ordre de coupure en cas de charges lourdes.<\/p>\n<p>C'est \u00e0 partir de ce moment que commence notre lutte contre les charges et pour la stabilisation du syst\u00e8me (de l'automne 2015 \u00e0 l'automne 2018). C'est \u00e0 ce moment-l\u00e0 que s'est produite la<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dodopizzadev\/blog\/498280\/\"><u>Grande chute<\/u><\/a><\/noindex>. D'autres pannes se sont \u00e9galement produites de temps \u00e0 autre, certaines \u00e9taient tr\u00e8s sensibles, mais nous pouvons consid\u00e9rer que la p\u00e9riode d'instabilit\u00e9 g\u00e9n\u00e9rale est maintenant derri\u00e8re nous.<\/p>\n<h4>Croissance rapide des affaires<\/h4>\n<p>Pourquoi n'a-t-on pas pu \u00ab faire bien d\u00e8s le d\u00e9part \u00bb ? Il suffit de regarder les graphiques suivants.<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/a6dd39909ecc553b2ff4a8fc370d5846.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>De plus, en 2014-2015, une ouverture en Roumanie a eu lieu et une ouverture aux \u00c9tats-Unis \u00e9tait en pr\u00e9paration.<\/p>\n<p>Le r\u00e9seau se d\u00e9veloppait tr\u00e8s rapidement, de nouveaux pays s'ouvraient, de nouveaux formats de pizzerias apparaissaient, par exemple, une pizzeria dans un food court a ouvert. Tout cela n\u00e9cessitait une attention consid\u00e9rable \u00e0 l'expansion des fonctionnalit\u00e9s de Dodo IS. Sans toutes ces fonctionnalit\u00e9s, sans le suivi en cuisine, la comptabilisation des produits et des pertes dans le syst\u00e8me, l'affichage des commandes dans la salle du food court, il est peu probable que nous discutions maintenant de l'architecture \u00ab correcte \u00bb et de l'approche \u00ab juste \u00bb au d\u00e9veloppement.<\/p>\n<p>En outre, des obstacles \u00e0 un r\u00e9examen opportun de l'architecture et \u00e0 l'attention port\u00e9e aux probl\u00e8mes techniques \u00e9taient la crise de 2014. De telles choses frappent durement les possibilit\u00e9s de croissance des \u00e9quipes, surtout pour une jeune entreprise comme Dodo Pizza.<\/p>\n<h3>Solutions rapides qui ont aid\u00e9<\/h3>\n<p>Les probl\u00e8mes n\u00e9cessitaient une solution. En gros, les solutions peuvent \u00eatre divis\u00e9es en 2 groupes :<\/p>\n<ul>\n<li>\n<p>Rapides, qui \u00e9teignent le feu et donnent une petite marge de s\u00e9curit\u00e9, nous gagnant ainsi du temps pour les changements.<\/p>\n<\/li>\n<li>\n<p>Syst\u00e9matiques et, donc, longues. La r\u00e9ing\u00e9nierie de plusieurs modules, la s\u00e9paration de l'architecture monolithique en services distincts (la plupart d'entre eux sont plut\u00f4t des macroservices que des microservices et il y a \u00e0 ce sujet) <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=XeNrWkRmVWw\"><u>rapport d'Andrei Morevsky<\/u><\/a><\/noindex>).&nbsp;<\/p>\n<\/li>\n<\/ul>\n<p>La liste s\u00e8che des changements rapides est la suivante :<\/p>\n<h4>Scale up master de base<\/h4>\n<p>Bien s\u00fbr, la premi\u00e8re chose \u00e0 faire pour lutter contre les charges est d'augmenter la puissance du serveur. Cela a \u00e9t\u00e9 fait pour le master de base et pour les serveurs web. Malheureusement, cela n'est possible que jusqu'\u00e0 un certain point, au-del\u00e0, cela devient trop co\u00fbteux.<\/p>\n<p>Depuis 2014, nous sommes pass\u00e9s \u00e0 Azure, \u00e0 ce sujet, nous avions \u00e9galement \u00e9crit \u00e0 l'\u00e9poque dans l'article \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/microsoft\/blog\/277821\/\">Comment Dodo Pizza livre des pizzas gr\u00e2ce au cloud Microsoft Azure<\/a><\/noindex>\u00bb. Mais apr\u00e8s une s\u00e9rie d'augmentations de serveurs pour la base, nous avons \u00e9t\u00e9 limit\u00e9s par les co\u00fbts.&nbsp;<\/p>\n<h4>R\u00e9pliques de la base en lecture<\/h4>\n<p>Deux r\u00e9pliques ont \u00e9t\u00e9 cr\u00e9\u00e9es pour la base :<\/p>\n<p><strong>ReadReplica<\/strong> <strong>pour les requ\u00eates sur les r\u00e9pertoires<\/strong>. Utilis\u00e9 pour la lecture des r\u00e9pertoires, tels que, villes, rues, pizzerias, produits (domaine \u00e0 changement lent), et dans les interfaces o\u00f9 un l\u00e9ger d\u00e9lai est acceptable. Il y avait 2 de ces r\u00e9pliques, nous avons assur\u00e9 leur disponibilit\u00e9 de la m\u00eame mani\u00e8re que celle du master.<\/p>\n<p><strong>ReadReplica pour les requ\u00eates sur les rapports<\/strong>. Cette base avait une disponibilit\u00e9 inf\u00e9rieure, mais tous les rapports y ont acc\u00e8s. Bien qu'ils aient des requ\u00eates lourdes sur d'\u00e9normes recalculs de donn\u00e9es, cela n'affecte pas la base principale et les interfaces op\u00e9rationnelles.&nbsp;<\/p>\n<h4>Caches dans le code<\/h4>\n<p>Il n'y avait nulle part de caches dans le code (au total). Cela entra\u00eenait des requ\u00eates suppl\u00e9mentaires, pas toujours n\u00e9cessaires, dans la base charg\u00e9e. Les caches \u00e9taient d'abord en m\u00e9moire, ainsi que sur un service de cache externe, qui \u00e9tait Redis. Tout \u00e9tait invalid\u00e9 dans le temps, les param\u00e8tres indiqu\u00e9s dans le code.<\/p>\n<h4>Plusieurs serveurs pour le backend<\/h4>\n<p>Le backend de l'application devait aussi \u00eatre mis \u00e0 l'\u00e9chelle pour supporter des charges accrues. Il \u00e9tait n\u00e9cessaire de transformer un serveur iis en un cluster. Nous avons d\u00e9plac\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.microsoft.com\/ru-ru\/aspnet\/core\/fundamentals\/app-state?view=aspnetcore-3.1\"><u>la session des applications<\/u><\/a><\/noindex> de la m\u00e9moire vers RedisCache, ce qui a permis de cr\u00e9er plusieurs serveurs derri\u00e8re un simple r\u00e9partiteur de charge en round robin. Au d\u00e9but, le m\u00eame Redis a \u00e9t\u00e9 utilis\u00e9 que pour les caches, puis il a \u00e9t\u00e9 r\u00e9parti sur plusieurs.&nbsp;<\/p>\n<p>En fin de compte, l'architecture s'est complexifi\u00e9e\u2026<\/p>\n<p><img decoding=\"async\" alt=\"L&#039;histoire de l&#039;architecture Dodo IS : une premi\u00e8re monolithique\" src=\"\/wp-content\/uploads\/2020\/10\/70a3e8d5578469239c08b4759ab32264.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u2026mais une partie de la tension a pu \u00eatre rel\u00e2ch\u00e9e.<\/p>\n<p>Ensuite, il fallait retravailler les composants charg\u00e9s, ce que nous avons commenc\u00e9 \u00e0 faire. Nous en parlerons dans la prochaine partie.<\/p>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/dododev\/blog\/521614\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443. \u0412 \u043e\u0441\u043d\u043e\u0432\u0435 \u043b\u0435\u0436\u0430\u043b\u0430 \u0438\u0434\u0435\u044f \u043f\u043e\u043b\u043d\u043e\u0439 \u0438 \u0442\u043e\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0446\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u043f\u0440\u0438\u0447\u0435\u043c \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u0438\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u0435\u0449\u0435 \u0442\u043e\u0433\u0434\u0430 \u0432 2011 \u0433\u043e\u0434\u0443 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0441\u043a\u0435\u043f\u0442\u0438\u0446\u0438\u0437\u043c\u0430. \u041d\u043e \u0432\u043e\u0442 \u0443\u0436\u0435 9 \u043b\u0435\u0442 \u043c\u044b \u0438\u0434\u0435\u043c \u043f\u043e [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95804","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=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\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\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit\" \/>\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=\"2020-10-03T11:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-03T11:42:27+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\udd47Histoire de l'architecture Dodo IS : monolithe pr\u00e9coce | ProHoster","description":"Ou chaque malheureuse entreprise avec un monolithe est malheureuse \u00e0 sa mani\u00e8re. Le d\u00e9veloppement du syst\u00e8me Dodo IS a commenc\u00e9 imm\u00e9diatement, avec la cr\u00e9ation de l'entreprise Dodo Pizza \u2014 en 2011.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","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\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Dodo IS: \u0440\u0430\u043d\u043d\u0438\u0439 \u043c\u043e\u043d\u043e\u043b\u0438\u0442 | ProHoster","og:description":"\u0418\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0441 \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043e\u043c \u043d\u0435\u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u0430 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Dodo IS \u043d\u0430\u0447\u0430\u043b\u0430\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0436\u0435, \u043a\u0430\u043a \u0438 \u0431\u0438\u0437\u043d\u0435\u0441 \u0414\u043e\u0434\u043e \u041f\u0438\u0446\u0446\u044b \u2014 \u0432 2011 \u0433\u043e\u0434\u0443.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/istoriya-arhitektury-dodo-is-rannij-monolit","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":"2020-10-03T11:42:27+00:00","article:modified_time":"2020-10-03T11:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95804","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":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:57:47","updated":"2022-09-28 00:34:07","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\/95804","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=95804"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/95804\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/95805"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=95804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=95804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=95804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}