Mort par mille microservices
(renegadeotter.com)- La culture qui consiste à adopter les microservices par défaut est critiquée pour avoir accru les coûts et la complexité afin de résoudre non pas de vrais problèmes d’échelle, mais des problèmes inexistants
- La fermeture de l’écosystème JavaScript/Node.js, les pratiques façon FAANG et l’abondance du capital-risque se sont combinées pour créer, même chez les startups, une ambiance où l’on imite les architectures web-scale
- Même avec Docker et Kubernetes, les difficultés des systèmes distribués — développement, débogage, déploiement, tests et résilience — ne disparaissent pas
- Dropbox, Twitter, Netflix, Facebook, GitHub, Instagram, Shopify, StackOverflow, WhatsApp, entre autres, ont démarré avec une base de code monolithique ou conservent encore aujourd’hui un monolithe au cœur de leur système
- La plupart des entreprises n’atteignent pas l’échelle qui exige réellement un système distribué ; il est donc plus réaliste d’extraire un service uniquement lorsqu’il existe une charge clairement isolable et extensible
Une culture qui vénère la complexité
- La satire qui échoue à expliquer un labyrinthe complexe de microservices pour obtenir une simple date de naissance d’utilisateur vise la surconception de la culture technique actuelle
- Le problème est que l’objectif a basculé : au lieu de résoudre les tâches immédiates, on brûle de l’argent à résoudre des problèmes inexistants
- La critique de JavaScript et de Node.js ne concerne pas seulement une technologie précise ; elle renvoie au danger d’un écosystème logiciel fermé qui pousse à réapprendre des leçons déjà acquises
- Le secteur a déjà connu par le passé des murs de complexité comme CORBA et SOAP avant de faire marche arrière
Les conditions qui ont créé la mode des microservices
- Des développeurs qui utilisaient JavaScript pour le navigateur se sont revendiqués “full-stack” et sont entrés dans le développement serveur et le code asynchrone ; les débuts de Node ressemblaient plutôt à des projets d’apprentissage individuels, et le JavaScript initial était un choix très problématique pour le serveur
- Le monde hors de Node ayant été perçu comme pratiquement inexistant, une pensée dogmatique s’est installée, selon laquelle la façon Node était la seule façon de faire
- Par la suite, des profils issus des FAANG ont rejoint des startups et diffusé “la manière de faire chez Google” comme une réponse universelle, indépendamment du contexte et de l’échelle
- La pression du type “sans
User Preferences Serviceséparé, ça ne passera pas à l’échelle” en est un exemple représentatif
- La pression du type “sans
- À l’époque où le capital-risque abondait, montrer aux investisseurs une croissance explosive est devenu plus important que le chiffre d’affaires, et les entreprises ont rapidement recruté des ingénieurs logiciels coûteux pour leur faire faire “quelque chose”
Les systèmes distribués restent difficiles
- Les microservices ont été présentés comme une “nouvelle façon d’écrire du logiciel scalable”, mais ils touchent en réalité au vieux problème des systèmes distribués
- Historiquement, les systèmes distribués étaient considérés comme des outils difficiles et dangereux, proches du dernier recours pour des problèmes particulièrement épineux
- Dans un système distribué, toutes les tâches suivantes sont plus difficiles et plus longues
- Développement
- Débogage
- Déploiement
- Tests
- Mise en place de la résilience
- Le développement fondé sur les microservices ne dispose pas d’outillage standard ni de framework commun ; même dans les années 2020, travailler sur des systèmes distribués n’est devenu qu’un peu plus facile
- Docker et Kubernetes ne font pas disparaître par magie la complexité intrinsèque d’une configuration distribuée
Des exemples où la simplicité donne de meilleurs résultats
- Le bilan de 5 ans d’audits de code de startups conclut que les startups qui réussissaient le mieux adoptaient une approche Keep It Simple presque sans complexe
- Les migrations prématurées vers les microservices, les architectures dépendantes du calcul distribué et les conceptions centrées sur la messagerie ont été des pièges majeurs qui ont mis plusieurs entreprises en difficulté
- Beaucoup de startups construisent des systèmes simples et performants tout en ressentant un faux complexe d’infériorité parce qu’elles “ne font pas de microservices dès le premier jour”
- À la question “qu’est-ce qui ne va pas si l’on n’a qu’un monolithe Django maintenu par quelques ingénieurs et une instance MySQL ?”, la réponse est presque toujours : “rien”
- Même des ingénieurs expérimentés peuvent se sentir inadéquats dans la culture technique actuelle, mais le vrai problème peut être un environnement mêlant confiance excessive injustifiée, gaspillage et effet Dunning-Kruger
Des entreprises qui ont aussi grandi avec des monolithes
- L’idée selon laquelle on ne peut pas grandir sans microservices tient du mythe
- Dropbox, Twitter, Netflix, Facebook, GitHub, Instagram, Shopify, StackOverflow et d’autres ont commencé avec une base de code monolithique, et certaines gardent encore un monolithe au cœur de leur système
- StackOverflow met en avant sur sa page de performance le fait d’exploiter un grand site avec peu de matériel
- Shopify utilise toujours un monolithe Rails et traite des milliards de jobs avec le très éprouvé Resque
- WhatsApp a fortement grandi avec un monolithe Erlang et environ 50 ingénieurs
- L’organisation d’ingénierie est restée petite, autour de 50 personnes
- Les équipes individuelles comptent 1 à 3 personnes et disposent d’une forte autonomie
- L’entreprise privilégie un petit nombre de serveurs et augmente autant que possible verticalement chacun d’eux
- Instagram a été racheté pour plusieurs milliards de dollars avec une équipe de 12 personnes, et Threads suit aussi le modèle Instagram
Ne pas résoudre des problèmes inexistants
- La question centrale est : “quel problème résout-on ?”
- Si l’échelle est le problème, il faut des données montrant quoi séparer en service distinct, et pourquoi
- Les systèmes distribués sont conçus pour l’échelle et la résilience, mais il faut aussi prendre en compte les situations où, lorsqu’un service ralentit ou tombe, le trafic se reporte sur d’autres services
- Les facteurs à considérer dépendent des schémas d’usage et des caractéristiques de charge du système
- Backpressure
- Circuit breakers
- Files d’attente
- Jitter
- Timeouts raisonnables sur tous les endpoints
- Garde-fous pour empêcher qu’un petit changement provoque une panne globale
- La plupart des entreprises n’atteignent pas l’échelle gigantesque qui exige un vrai système distribué
- Imiter Amazon et Google sans avoir leur échelle, leur expertise ni leurs ressources mène facilement à gaspiller du temps et de l’argent
- Reste cet avertissement : un mauvais système distribué est encore plus difficile qu’un système distribué en soi
L’idéal et la réalité des services par équipe et des API
- La tentative d’aligner une topologie distribuée sur la structure de l’entreprise part de l’idée qu’un problème devient plus simple si on le divise en petits morceaux
- Le microservice idéal est strictement maintenu par une équipe dédiée, caché derrière une belle API versionnée et rétrocompatible, et nécessite très peu de communication avec les autres équipes
- Dans la réalité, les canaux Slack débordent de releases, de bugs, de changements de configuration, de breaking changes et d’annonces
- Tout le monde doit constamment suivre toute la situation, et il est courant que des équipes déjà occupées se retrouvent à gérer maladroitement plusieurs microservices
- La propriété des services change au gré des mouvements de personnes, et l’on finit par construire plusieurs mauvaises voiturettes de golf au lieu d’une bonne voiture de course
Ce que les microservices font perdre
-
L’affaiblissement du DRY
- Les microservices ne sont fondamentalement pas DRY, et chaque service embarque du boilerplate redondant
- Dans les petits microservices, le code de plomberie prend une telle place que l’instance de service moyenne peut ressembler davantage à du code de “service” qu’à du code produit
- Lorsqu’on essaie d’extraire du code commun, toutes les options sont douloureuses
- Créer une bibliothèque commune oblige à décider d’une stratégie de versions et de mises à jour
- On peut créer régulièrement des pull requests dans tous les dépôts pour imposer les mises à jour
- Regrouper le tout en monorepo apporte ses propres problèmes
- On accepte une certaine duplication de code, ou bien chaque équipe réinvente la roue à chaque fois
-
La dégradation de l’expérience développeur
- L’expérience développeur correspond au niveau de friction et d’effort nécessaire pour développer une nouvelle fonctionnalité ou corriger un bug
- Dans un environnement de microservices, il faut une carte mentale de tout le système pour savoir quels services lancer pour une tâche donnée, quelles équipes solliciter et à qui poser quelles questions
- Spotify a créé Backstage pour cataloguer ses nombreux systèmes et services, ce qui montre le coût élevé de ce jeu
- Les entreprises qui ne sont pas Spotify finissent par bricoler leurs propres solutions, sans pouvoir vraiment attendre robustesse ni portabilité
- Démarrer un nouveau service implique aussi d’automatiser beaucoup d’éléments
- Droits développeur GitHub/GitLab
- Variables d’environnement et configuration de base
- CI/CD
- Contrôles de qualité du code
- Configuration des revues de code
- Règles et protections de branches
- Monitoring et observabilité
- Harnais de test
- Infrastructure as Code
- Si plusieurs langages de programmation sont utilisés, cette liste se multiplie par le nombre de langages
- Peaufiner ces automatisations peut prendre des mois, et l’on se retrouve à choisir entre construire le produit et construire des outils
-
La difficulté des tests d’intégration
- Même si les tests d’un service isolé et les tests unitaires passent, cela ne dit pas si les chemins critiques restent valides après chaque commit
- Les tests d’intégration en environnement distribué sont traités comme un problème presque impossible, et l’observabilité est venue prendre leur place
- L’observabilité est devenue un nouveau secteur industriel, qui exige non seulement de l’argent mais aussi du temps développeur
- L’observabilité ne fonctionne pas immédiatement comme un plugin ; il faut comprendre et mettre en œuvre les releases canary, les feature flags, etc.
- Découper le problème ne le rend pas plus facile à résoudre : on obtient un ensemble de problèmes plus difficiles
Un monolithe n’est pas automatiquement du bon code
- Défendre le monolithe ne signifie pas que “monolithe” veut dire bon code et “microservices” mauvais code
- Dans la réalité, il existe beaucoup de monolithes médiocres produits par des équipes pressées ou ordinaires
- Mais les systèmes distribués sont beaucoup plus impitoyables envers les approximations, les mauvaises décisions et les modes de panne oubliés
- Si l’on ne fonctionne pas constamment à un haut niveau, on en paie le prix dans un système distribué
De simples services peuvent suffire, sans être “micro”
- Un service n’a pas forcément besoin d’être “micro” ; un simple service peut suffire dans certains cas
- Certaines startups sont allées jusqu’à créer un service par fonction, montrant jusqu’où peut aller un cargo cult non validé
- Commencer par un monolithe est une option claire
- Le pattern “trunk & branches” peut aussi convenir dans de nombreux cas
- Les fonctionnalités cœur sont assurées par le monolithe principal, les “viande et pommes de terre” du système
- Les charges clairement identifiables qui nécessitent une mise à l’échelle distincte sont prises en charge par des services branch
- Un
Image-Resizing Servicegourmand en CPU a davantage de sens comme service séparé qu’unUser Registration Service - Demander si le nombre d’inscriptions par seconde est assez élevé pour exiger une mise à l’échelle horizontale indépendante devient un critère pour décider de séparer un service
Le reflux de la mode et les choix réalistes
- La surchauffe autour des microservices semble retomber, et le resserrement des flux de capital-risque amène le marché à pousser les entreprises vers des décisions plus sensées
- Dépenser de l’argent dans une architecture web-scale sans avoir de problème web-scale n’est pas soutenable
- Si l’on doit aller de New York à Philadelphie, la solution adaptée au problème consiste à acheter un billet Amtrak de 90 minutes plutôt qu’à construire un vaisseau spatial complexe
1 commentaires
Avis de Hacker News
Je fais partie de ceux qui ont fortement défendu les microservices ; j’ai aidé à construire la plateforme Netflix et j’ai parcouru le monde pour en vanter les avantages. Pourtant, quand je conseille des startups, je leur dis presque toujours de commencer par un monolithe
Il est beaucoup plus simple de garder une seule base de code et une seule base de données, et cela peut passer à l’échelle pendant assez longtemps. Si l’on utilise un stockage clé/valeur comme DynamoDB, on perd une partie des fonctionnalités relationnelles, mais on peut tenir encore plus longtemps
Un monolithe peut aussi être déployé sur Lambda, et l’on peut bénéficier des avantages de Lambda sans découper les services
Ce n’est qu’une fois la croissance arrivée qu’il faut extraire en microservices, avec leur propre stockage de données, les parties qui doivent passer à l’échelle indépendamment ou être déployées séparément
Les microservices consomment au minimum 25 % du temps d’ingénierie rien que pour maintenir la plateforme ; s’ils ne permettent pas de récupérer au moins autant d’efficacité, ils n’ont aucune valeur
En phase de croissance — et même dans la plupart des cas — mieux vaut ne pas faire de microservices du tout
Et, par pitié, il ne faut pas découper les données. Les données sont bien plus complexes à gérer que le code
On peut toujours rendre les choses plus complexes plus tard. On peut extraire une partie d’un monolithe pour en faire un service ; c’est difficile, certes, mais cela n’a rien à voir avec le fait de retirer d’un système une complexité déjà introduite
Quiconque a déjà tenté de ramener plusieurs microservices dans un monolithe le sait : en général, la charge de travail ressemble à une réécriture depuis zéro
Pour ce type de produit, on pourrait vraiment faire tourner l’environnement de production sur un ordinateur portable si on le voulait
Dans mon emploi précédent, on avait organisé une fête aux microservices pour 300 clients. C’était pourtant une activité où quelques milliers de clients auraient déjà été un succès, et quelques dizaines de milliers un immense succès
En général, comme on ne consacre pas 25 % du temps d’ingénierie à maintenir la plateforme, elle devient impossible à exécuter en local et l’environnement de production tient à peine avec du ruban adhésif
Lors d’un entretien récent, on m’a demandé de concevoir un système pour « 500 millions d’utilisateurs simultanés », alors que l’entreprise relevait plutôt du modèle avec peu de clients et un revenu élevé par client
Je ne sais toujours pas si c’était un test pour voir si je relevais que 500 millions représente environ 10 % de la population mondiale connectée à Internet, donc un chiffre absurde, ou si la startup croyait vraiment pouvoir en arriver là
J’ai répondu que je me concentrerais sur la chose la plus simple : construire un monolithe, ajouter des fonctionnalités et vérifier que les gens veulent vraiment le produit. Je n’ai pas été recruté
Je travaille sur un énorme monolithe avec environ 800 contributeurs, et ajouter un champ aussi simple que la date de naissance d’un utilisateur est tout aussi complexe. Cela dit, toute la complexité n’est pas technique : comme on touche au code de tout le monde, il faut un « alignement organisationnel »
Les cycles de conception et de revue se répètent sans fin, il faut l’approbation d’au moins deux architectes, et la tâche est ajoutée à plusieurs cycles de planification. Le code réel prend moins d’une demi-journée
Lors de la revue de code, il faut atteindre 90 % de couverture de tests, mais il y a tellement de tests que la PR est trop grosse : on la découpe donc en plusieurs PR, qui finissent intégrées sur plusieurs releases hebdomadaires
On cache alors la fonctionnalité derrière un feature flag, mais il y a actuellement 13 000 feature flags
Une fois en production, avec les dashboards et le monitoring branchés, on l’active puis on la désactive à répétition. On ne sait pas bien pourquoi la fonctionnalité d’anniversaire a cassé le service de facturation, mais elle semble en être la cause, donc il faut l’analyser pendant des semaines
Au bout d’un an, l’ingénieur chargé de cette tâche recevra peut-être une bonne évaluation et deviendra candidat à une promotion. Puis il sera immédiatement affecté à un autre projet bancal, entamé trois ans plus tôt : permettre aux utilisateurs de définir leur fuseau horaire
Les microservices comme les monolithes ne sont ni des marteaux universels ni des balles d’argent ; à l’inverse, ils ne sont pas le mal absolu. Ce sont deux outils avec des compromis, qui se combinent avec des compromis propres au contexte de chaque organisation
Le problème, c’est que les ingénieurs sont fascinés par la complexité, confondent « simplicité » et « bricolage », et que les organisations imitent aveuglément des outils et des patterns d’architecture
Appliquer naïvement une architecture ou un design pattern en pensant que le simple fait de l’utiliser apportera des bénéfices ne produit pas ces bénéfices
J’ai essayé de garder en tête que le génie logiciel est une lutte sans fin contre la complexité, avec des réussites et des échecs
Cette lutte doit être permanente et être la priorité absolue. Sinon, on arrive à ce genre de situation
Aucune architecture ni idéologie ne met fin à cette guerre : c’est simplement la nature même du métier
En production, ces flags de release ne pouvaient pas être activés, et les développeurs devaient supprimer le code du flag avant les tests finaux et la release
Cela ajoute un peu de travail pour chaque fonctionnalité nécessitant un flag, mais au bout de quelques mois, la réduction de la complexité de la base de code est largement payante
Les microservices ne sont pas une solution à un problème technique, mais à un problème social.
Une équipe de N ingénieurs nécessite N² coordinations. Les grandes équipes s’enlisent dans des réunions, des e-mails et des revues de conception sans fin ; les petites équipes sont plus efficaces, mais peinent à maintenir de grands systèmes.
En découpant le système en sous-systèmes, chaque équipe peut se concentrer sur sa pièce du puzzle tout en réduisant la coordination entre les personnes.
Il est vrai que les microservices ajoutent de la complexité et de l’overhead, mais cette approche permet aux grandes organisations de construire de grands systèmes rapidement et de les améliorer par itérations.
Désormais, au lieu de connexions directes, il faut des réunions « transverses » entre équipes et des couches de communication complexes.
Si l’on a trouvé un découpage qui nécessite très peu de connexions entre sous-systèmes, alors ces connexions n’existaient déjà pas dans le système d’origine, et il n’y avait pas non plus de problème en N².
Ce que j’ai vu à répétition, c’est une seule énorme équipe où « tout le monde est responsable de tous les microservices », ce qui finit par faire que plus personne n’est responsable de quoi que ce soit.
Pour résoudre un « problème humain », on transforme un petit problème technique en problème complexe de système distribué.
Et là, on a un vrai problème.
Il prenait en charge deux types de bases de données et disposait aussi d’un exécuteur de tâches capable de scaler horizontalement.
À un moment, nous étions 35, puis les licenciements nous ont ramenés à 7, et c’est là que nous avons commencé à accomplir beaucoup plus de choses. Parce que le temps passé à aligner tout le monde avait fortement diminué.
Il y avait beaucoup moins de réunions, d’approbations, de revues, de planification, de rétrospectives et de réunions de management ; les développeurs avaient davantage de marge de manœuvre et terminaient simplement le travail.
Les fonctionnalités étaient facilement livrées en moitié moins de temps, et nous consacrions les 50 % restants au remboursement de la dette technique. Comme nous réduisions impitoyablement la complexité, l’ajout de nouvelles fonctionnalités s’est aussi accéléré.
Certains projets ont sans doute besoin de plus de monde, mais je pense qu’il existe un plafond à la complexité qu’on peut ajouter à un système dans un temps donné.
Si l’on dépasse un seuil et qu’on ajoute des développeurs, le nombre de fonctionnalités par semaine reste le même, mais tout le monde travaille un peu moins et passe davantage de temps à communiquer.
Répétez ce processus jusqu’à atteindre des milliers de personnes, et il faut des mois pour ajouter un champ.
Je me demande si l’on a envisagé de déplacer les choses dans des dossiers différents.
Pas besoin d’un nouveau dépôt ni d’une nouvelle configuration Docker pour modulariser. Utilisez simplement des dossiers.
Un schéma que j’ai souvent vu est le suivant. Les CTO ou VP actuels ont créé le monolithe d’origine, ou ont participé à sa création.
Personne n’a envie de dire au CTO que ce code est mauvais. Ou bien c’est simplement du code qui, parce que les temps ont changé, a besoin d’une refonte complète, sans que cela ait quoi que ce soit à voir avec le fait qu’il s’agisse d’un monolithe.
Le CTO est trop occupé par le marketing ou la levée de fonds pour trancher entre microservices et monolithe, et c’est un architecte fraîchement recruté qui prend la décision.
Tout le monde acclame les microservices. Cela colle bien au récit d’une entreprise tech sérieuse en forte croissance, et personne ne veut être le seul à s’y opposer ni critiquer le CTO.
Il est rare que les microservices soient recommandés parce qu’ils constituent sincèrement le meilleur compromis. C’est plutôt parce que les gens aiment leur travail, aiment recruter davantage et que cela colle bien au récit de l’entreprise.
Pendant une grande refonte, on peut réécrire et améliorer beaucoup de code ; il suffit d’appeler cela une migration vers les microservices.
Au final, cela devient une façon de réécrire en masse du vieux mauvais code, sans blesser les sentiments du CTO, en suivant la foule, et sous une cause que presque tout le monde soutient.
Qu’il s’agisse d’un lead engineer individuel ou d’un CTO/fondateur, on finit toujours, avec le recul, par conclure qu’on aurait pu faire mieux, et par voir, avec joie et effroi, les bénéfices et les défauts des patterns et processus que l’équipe a suivis de bonne foi.
J’aime d’autant plus ce texte qu’il confirme mes biais
Je le dis depuis des années, mais je vois la folie des microservices surtout comme un prétexte pour que des ingénieurs moyens maintiennent la demande. La médiocrité l’alimente, et en même temps elle fait tourner beaucoup d’entreprises tech
Il n’y a pas assez d’ingénieurs compétents capables de bien manier UNIX et de construire de beaux systèmes minimalistes comme StackOverflow
Donc les microservices comme écran de fumée pour masquer la médiocrité vont continuer d’exister. D’autant plus que des fournisseurs cloud comme AWS se promeuvent par tous les canaux possibles et poussent les décideurs à choisir cette voie
Si l’on ne parle pas de cloud, de microservices et de tout dernier framework non éprouvé, on passe pour un vieux dépassé
Alors même que de tels systèmes sont rarement les plus efficaces, les plus robustes ou les plus sûrs
Mon entreprise actuelle développe des logiciels utilisés en interne par d’autres sociétés ; il y a au maximum 200 utilisateurs simultanés et pas de pics d’utilisation
Ce serait l’environnement parfait pour un serveur web ordinaire, sans problèmes de montée en charge imprévus, mais tout le monde veut aller dans le cloud
À mon avis, c’est parce que la direction, les programmeurs et même les clients ont été convaincus par le marketing du cloud et pensent que le cloud, c’est cool
Les entreprises n’expédient pas seulement leur organigramme : elles embarquent aussi dans le produit tous leurs dysfonctionnements et tout leur passif historique
Il y a cinq ans, c’était peut-être une belle plateforme efficace et bien conçue, avec un modèle de données et des API propres, du code bien écrit et testé ; mais après cinq ans de changements de cap incessants du CEO, de demandes clients de dernière minute poussées par les commerciaux, de chefs de produit ajoutant des fonctionnalités ni nécessaires ni demandées, avec trop peu de personnel et de temps, elle peut devenir un désordre complet
Un jour, on se retrouve face à un énorme tas de dette technique, avec des corrections de bugs et des ajouts de fonctionnalités qui prennent plus de temps que nécessaire, et les microservices se mettent à sonner comme le chant des sirènes qui promet qu’on n’aura pas besoin de tout brûler pour repartir de zéro
Ça peut sembler être du pinaillage, mais il y a un point plus général : les choix technologiques sont rarement le goulet d’étranglement
À l’inverse, les microservices ont beaucoup plus de pièces mobiles et de modes de défaillance, donc ils sont bien plus complexes ; des ingénieurs moyens, et même beaucoup d’ingénieurs qui ne le sont pas, ont beaucoup plus de chances d’y créer des problèmes
J’ai l’impression qu’on n’a pas réussi à enseigner correctement à la génération actuelle ce qui compte dans ce métier
Je compatis, car nous sommes en train de passer aux microservices dans une petite équipe. Le plus gros problème, c’est l’observabilité
Quand un problème survient en production, déterminer précisément ce qui a mal tourné devient une corvée énorme
Suivre les logs d’une seule application distribuée ne suffit pas : il faut regarder simultanément les logs de plusieurs applications distribuées, avec des messages entremêlés
Ça irait si nous avions un outil pour visualiser les traces, mais comme nous sommes une petite équipe, notre bande passante humaine est limitée, et nous n’avons pas encore ce genre d’outil
À l’inverse, le monolithe avait NewRelic intégré depuis des années. Il y avait des problèmes de performance, mais la plupart ont été résolus avec des index et quelques vues matérialisées
Il est facile de comprendre ce qui ne va pas, et même si le code est ancien et rempli de conditions de concurrence, le dépannage en lui-même n’est pas difficile
Je redoute le moment où chaque microservice aura sa propre instance de base de données et où il faudra les mettre à niveau plus tard. J’aurais voulu plusieurs bases de données dans une seule instance, mais cette architecture n’est pas une option
La journalisation centralisée et le traçage des appels de service/de l’exécution du code ne sont pas nouveaux. Mais ils sont souvent repoussés à plus tard, jusqu’à ce qu’on se retrouve dans ce genre de situation désagréable
Comme les bons outils n’ont pas été mis en place dès le départ, l’équipe devient plus petite et plus contrainte, puisqu’elle sait peu de choses, voire rien, sur ce que font les services
Les instances de base de données peuvent être mises à niveau une par une. Sauf s’il y a des bugs graves, de sécurité par exemple, il n’y a pas besoin de se presser juste parce qu’une mise à niveau est possible
Lire ce genre de texte me fait étrangement l’effet d’une thérapie. Il y a dix ans, je disais déjà la même chose haut et fort, mais on me traitait d’incrédule et on me disait de me taire
Pardonnez-moi si le paradigme des « microservices » m’a laissé un goût amer. J’ai vécu ce qui arrive quand on adopte complètement une technologie à la mode sans en comprendre pleinement les compromis
Il y a longtemps, quand j’ai été embauché chez StumbleUpon, c’était la période où un soi-disant docteur en informatique de premier plan voulait remplacer le monolithe PHP qui fonctionnait bien et générait des revenus par une architecture de microservices Scala/Java
Le processus d’onboarding des nouveaux employés incluait même un étrange tête-à-tête avec ce fou d’informaticien ; il expliquait avec passion les avantages des microservices et esquivait habilement les questions du genre « pourquoi créer un service distribué juste pour additionner une liste de nombres ? » d’un geste signifiant « tu ne comprendrais pas pourquoi c’est tellement mieux »
Après plus de 30 nouvelles embauches et plus de quatre ans de développement intensif, l’entreprise, qui n’était plus rentable, n’avait plus qu’un enfer distribué plus lent, rempli de bugs et impossible à déboguer
Le concepteur et architecte en chef a jugé que c’était le bon moment pour partir en « année sabbatique », et peu après, une énième levée de fonds s’est épuisée et tout le monde s’est retrouvé à chercher du travail
Cet article, pour reprendre la métaphore d’Amtrak, a complètement déraillé
L’auteur part du principe que si l’on a créé de mauvais microservices, il aurait suffi de faire un monolithe pour que, comme par magie, tout se passe bien
Même avec le même niveau de conception et d’ingénierie ayant produit des microservices médiocres, il suggère que viser un monolithe aurait donné un résultat en or
Il y a aussi beaucoup d’autosatisfaction tout au long du texte, par exemple dans les commentaires sur les développeurs JS full-stack
Mais il y a très peu de contenu relevant réellement de l’ingénierie. On pourrait s’attendre à des mesures ou à des données, mais on n’obtient que de longues tirades
Gérer la complexité pour maintenir faible le coût des changements système est un bon objectif, mais ce n’est pas ce que propose cet article
S’il l’avait reconnu, ou s’il avait présenté des données, voire au moins une anecdote, le texte aurait été meilleur
Dans notre équipe, je choisirais un développeur frontend brillant et enthousiaste qui veut élargir son horizon et devenir développeur full-stack, plutôt que quelqu’un qui pense déjà tout savoir et n’a plus rien à apprendre
À mon poste actuel, je lutte contre cette tendance ; avec un certain succès dans certaines équipes, beaucoup moins dans d’autres. Ces équipes se battent maintenant avec le monolithe distribué qu’elles ont elles-mêmes créé
Ironiquement, les anciens de FAANMG sont tous plutôt favorables au monolithe
Beaucoup de gens semblent oublier que les microservices sont le résultat d’un processus itératif. Au final, on extrait du monolithe les parties qui doivent passer à l’échelle
Les microservices exigent beaucoup d’infrastructure de base qu’on n’a pas envie de maintenir tant qu’on n’en a pas besoin
La plupart des entreprises n’ont même pas la plateforme adéquate pour prendre en charge ce modèle
Je suis d’accord. Dans mon entreprise, les outils fonctionnent tellement mal que nous avons carrément abandonné le débogage
Pour exécuter un seul service sur une machine locale, il faut configurer les 9 autres pour qu’ils s’y connectent
Et si l’on crée une « fonctionnalité » pour un client, il faut bien sûr toucher au moins 2 services en même temps afin de déplacer davantage de données
Si l’on place un point d’arrêt d’un côté, l’autre côté expire
Résultat : tous les développeurs déploient des builds de release dans une VM locale, ajoutent des console.log, System.PrintLines() et _logger sans hot reload, puis lisent des fichiers de logs éparpillés
Évidemment, je compte quitter le navire
Tout passer en traçage distribué serait encore mieux, mais pour suivre correctement les requêtes, il faudrait uniformiser les métadonnées de traçage partout, ce qui représente un investissement plus important
Cela aiderait probablement davantage l’exploitation que le développement, mais ce serait tout de même utile. Rien que des informations de spans correctes donnent déjà beaucoup d’insights pour comprendre le chaos
Si un point d’arrêt d’un côté provoque un timeout de l’autre, je me demande s’il n’existe pas un moyen d’augmenter ou de désactiver les timeouts en mode développement