{"id":74,"date":"2018-02-27T10:15:00","date_gmt":"2018-02-27T13:15:00","guid":{"rendered":"https:\/\/dcoder.io\/blog\/monolithe-ou-microservices\/"},"modified":"2018-02-27T10:15:00","modified_gmt":"2018-02-27T13:15:00","slug":"monolithe-ou-microservices","status":"publish","type":"post","link":"https:\/\/dcoder.io\/blog\/fr\/monolithe-ou-microservices\/","title":{"rendered":"Monolithe ou microservices : d\u00e9cider sans casser le produit"},"content":{"rendered":"<p><strong>Commencez par un monolithe bien organis\u00e9.<\/strong> Les microservices r\u00e9solvent un probl\u00e8me d&#8217;\u00e9quipes, trop de monde sur le m\u00eame code, bien avant de r\u00e9soudre un probl\u00e8me d&#8217;\u00e9chelle. Avec une \u00e9quipe de cinq personnes, l&#8217;architecture distribu\u00e9e vous co\u00fbtera plus qu&#8217;elle ne vous apportera.<\/p>\n<p>La conversation sur les microservices d\u00e9marre g\u00e9n\u00e9ralement du mauvais c\u00f4t\u00e9. Quelqu&#8217;un lit que Netflix exploite des centaines de services ind\u00e9pendants et en conclut que le syst\u00e8me de l&#8217;entreprise devrait faire de m\u00eame. Sauf que Netflix y est arriv\u00e9 pouss\u00e9 par un probl\u00e8me que la plupart des entreprises n&#8217;ont pas : des milliers d&#8217;ing\u00e9nieurs qui ne peuvent pas s&#8217;attendre les uns les autres pour livrer une modification.<\/p>\n<h2>Le co\u00fbt que le sch\u00e9ma ne montre jamais<\/h2>\n<p>Sur la diapositive, les microservices sont des bo\u00eetes nettes reli\u00e9es par des fl\u00e8ches. En production, chaque fl\u00e8che est un appel r\u00e9seau qui peut \u00e9chouer, tra\u00eener ou r\u00e9pondre \u00e0 moiti\u00e9.<\/p>\n<p>Quand vous d\u00e9coupez un syst\u00e8me en services, vous gagnez l&#8217;ind\u00e9pendance de d\u00e9ploiement et vous payez avec :<\/p>\n<ul>\n<li><strong>Des transactions distribu\u00e9es.<\/strong> Ce qui \u00e9tait un <code>BEGIN ... COMMIT<\/code> devient une chor\u00e9graphie de compensations. Commande cr\u00e9\u00e9e, paiement refus\u00e9, stock d\u00e9j\u00e0 r\u00e9serv\u00e9. Et maintenant ?<\/li>\n<li><strong>Du d\u00e9bogage en plusieurs endroits \u00e0 la fois.<\/strong> Une requ\u00eate lente traverse quatre services. Sans tra\u00e7age distribu\u00e9, vous cherchez dans le noir.<\/li>\n<li><strong>L&#8217;environnement local.<\/strong> Le nouveau d\u00e9veloppeur doit d\u00e9marrer sept services pour tester un \u00e9cran.<\/li>\n<li><strong>Le versionnement des contrats.<\/strong> Modifier un champ de r\u00e9ponse cesse d&#8217;\u00eatre un commit et devient une n\u00e9gociation entre \u00e9quipes.<\/li>\n<\/ul>\n<p>Ce co\u00fbt devient rentable lorsque vous avez assez d&#8217;\u00e9quipes pour que le v\u00e9ritable goulot d&#8217;\u00e9tranglement soit la coordination humaine. Avant cela, c&#8217;est un imp\u00f4t pur.<\/p>\n<h2>Le monolithe modulaire, que presque personne n&#8217;essaie<\/h2>\n<p>Il existe une marche entre \u00ab tout emm\u00eal\u00e9 \u00bb et \u00ab tout s\u00e9par\u00e9 \u00bb, et c&#8217;est l\u00e0 que la plupart des syst\u00e8mes devraient vivre longtemps. Un seul processus, une seule base, mais avec des fronti\u00e8res internes prises au s\u00e9rieux.<\/p>\n<p>Concr\u00e8tement, cela veut dire trois choses. Chaque domaine (facturation, catalogue, utilisateurs) vit dans son propre module, avec sa propre couche d&#8217;acc\u00e8s aux donn\u00e9es. Les modules dialoguent par des interfaces explicites, sans fouiller dans les tables les uns des autres. Et pas de <code>JOIN<\/code> entre des tables de domaines diff\u00e9rents : si vous en avez eu besoin, la fronti\u00e8re est au mauvais endroit.<\/p>\n<p>Construit ainsi, le jour o\u00f9 un module doit devenir un service \u00e0 part enti\u00e8re, il le peut. Les d\u00e9pendances sont d\u00e9j\u00e0 cartographi\u00e9es et l&#8217;extraction devient l&#8217;affaire de quelques jours, pas d&#8217;un trimestre.<\/p>\n<h2>Les signes concrets que le moment est venu<\/h2>\n<p>Pas une impression. Des preuves :<\/p>\n<ol>\n<li><strong>Des d\u00e9ploiements qui se bloquent mutuellement.<\/strong> Deux \u00e9quipes qui attendent r\u00e9guli\u00e8rement la file de livraison de l&#8217;autre.<\/li>\n<li><strong>Des profils de charge tr\u00e8s diff\u00e9rents.<\/strong> Le module de reporting consomme huit fois plus de processeur que le reste, et vous dimensionnez toute l&#8217;application rien que pour lui.<\/li>\n<li><strong>Des exigences de disponibilit\u00e9 diff\u00e9rentes.<\/strong> Le paiement ne peut pas tomber. Le panneau d&#8217;administration interne peut rester dix minutes hors ligne sans le moindre drame.<\/li>\n<li><strong>Une technologie incompatible.<\/strong> Une partie du syst\u00e8me exige un calcul lourd que le langage principal ne g\u00e8re pas bien.<\/li>\n<\/ol>\n<p>Un seul \u00e9l\u00e9ment de cette liste justifie d&#8217;extraire ce morceau pr\u00e9cis. Aucun \u00e9l\u00e9ment de la liste ne justifie de tout r\u00e9\u00e9crire.<\/p>\n<h2>Extrayez-en un, pas trente<\/h2>\n<p>Le moment venu, le chemin s\u00fbr est toujours le m\u00eame. Choisissez le module \u00e0 la fronti\u00e8re la plus nette et au couplage le plus faible. Publiez-le comme service. Laissez le monolithe l&#8217;appeler. Puis observez ce qui casse, car quelque chose cassera, et il vaut bien mieux le d\u00e9couvrir avec un service qu&#8217;avec quinze.<\/p>\n<p>Si la premi\u00e8re extraction se passe bien, la deuxi\u00e8me aussi. Si c&#8217;est un cauchemar, vous venez d&#8217;apprendre quelque chose de pr\u00e9cieux au prix le plus bas possible.<\/p>\n<h2>Ce qui rapporte davantage avant d&#8217;en arriver l\u00e0<\/h2>\n<p>La plupart des syst\u00e8mes qui \u00ab ont besoin de microservices \u00bb ont en r\u00e9alit\u00e9 besoin de choses beaucoup moins prestigieuses.<\/p>\n<p>Des index en base, pour commencer. Je suis s\u00e9rieux : la majorit\u00e9 des goulots d&#8217;\u00e9tranglement qui deviennent des arguments d&#8217;architecture sont une requ\u00eate sans index. Ensuite du cache au bon endroit, avec une invalidation r\u00e9fl\u00e9chie. Une file d&#8217;attente pour le travail lourd, qui retire l&#8217;envoi d&#8217;e-mails, la g\u00e9n\u00e9ration de rapports et le traitement d&#8217;images du chemin de la requ\u00eate utilisateur. Et, en dernier recours, un serveur plus puissant. La mont\u00e9e en charge verticale est d\u00e9mod\u00e9e, elle est born\u00e9e, et elle r\u00e9sout bien plus de cas que la litt\u00e9rature ne veut l&#8217;admettre.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les microservices r\u00e9solvent un probl\u00e8me d&#8217;organisation avant de r\u00e9soudre un probl\u00e8me technique. Comment savoir si votre entreprise a ce probl\u00e8me, et quoi faire tant qu&#8217;elle ne l&#8217;a pas.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-74","post","type-post","status-publish","format-standard","hentry","category-sem-categoria"],"_links":{"self":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts\/74","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/comments?post=74"}],"version-history":[{"count":0,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/posts\/74\/revisions"}],"wp:attachment":[{"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/media?parent=74"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/categories?post=74"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dcoder.io\/blog\/wp-json\/wp\/v2\/tags?post=74"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}