28 points par GN⁺ 2025-05-10 | 10 commentaires | Partager sur WhatsApp
  • Séparer trop tôt le code en microservices dans une startup en phase initiale entraîne une baisse importante de la productivité de l’équipe et une hausse de la complexité
  • Une architecture monolithique optimise les chances de survie grâce à des déploiements simples, une mise en production rapide des nouvelles fonctionnalités et une collaboration efficace
  • Les microservices n’apportent les bénéfices du découpage que lorsqu’il existe un besoin de forte montée en charge, des charges de travail variées ou des exigences d’exécution distinctes
  • Une séparation excessive des services, la prolifération des dépôts, un environnement de développement local instable et des divergences dans la stack technique conduisent à un ralentissement et à une baisse du moral des équipes
  • Pour une startup, le meilleur choix est de commencer par un monolithe et de ne découper que lorsqu’un goulot d’étranglement clair apparaît

Introduction et contexte

  • La survie d’une startup dépend de sa capacité à itérer vite, à livrer de nouvelles fonctionnalités et à créer de la valeur pour les utilisateurs
  • L’architecture de base du projet, la stack technique et le choix du langage de programmation ont un impact direct sur la vitesse de l’équipe
  • L’adoption précoce des microservices peut paraître élégante sur le papier, mais en pratique elle provoque une baisse de productivité, des services inachevés et un excès de complexité
  • Données : orchestration des services, problèmes liés à Docker et aux scripts, CI/CD dupliquée, couplage entre services, coût de l’observabilité, dispersion des tests, etc. — autant de coûts de développement supplémentaires
  • Au lieu de foncer vers une architecture complexe, le texte insiste sur l’importance d’une architecture pragmatique

Les points forts du monolithe

  • Qu’il s’agisse d’un SaaS ou d’un simple wrapper de base de données, une application se complexifie avec le temps, mais une architecture monolithique reste plus simple et plus facile à garder flexible
  • Le déploiement est facile, l’écosystème est bien soutenu par des frameworks populaires comme Django, ASP.Net ou Nest.js, et les bénéfices de la communauté open source sont importants
  • Cas concret : dans une startup de l’immobilier, un monolithe Laravel a permis de gérer facilement de nombreuses intégrations tierces et l’extension des fonctionnalités
  • Il a été possible de se concentrer sur les besoins métier et les attentes sans introduire une infrastructure complexe ni découper en microservices
  • Leçon : la simplicité de l’architecture aide l’équipe à se concentrer sur les déploiements, et l’échelle reste suffisante tant qu’on évite d’échouer dans la modularisation interne

Les microservices sont-ils toujours le meilleur choix ?

  • Beaucoup d’ingénieurs pensent que les microservices sont la bonne réponse par défaut, alors qu’en réalité ils ne révèlent leur valeur que lorsqu’il existe une raison particulière, comme des besoins de montée en charge
  • Avec une petite équipe, à petite échelle et dans une phase de changements rapides, ils produisent au contraire des effets négatifs : infrastructure dupliquée, développement local plus lent, cycles d’itération plus longs
  • Même des entreprises comme Segment ont connu une transition imposée par une structure inefficace
  • Leçon : les microservices sont un outil pour résoudre des goulots d’étranglement, pas un modèle initial

Pourquoi les microservices échouent surtout en phase de démarrage

1. Des frontières de service arbitraires

  • En s’appuyant sur la conception orientée domaine ou la clean architecture, on tente de découper les services par logique métier → mais les frontières de service ne correspondent pas réellement à la logique effective
  • Exemple : séparer utilisateurs, authentification et autorisations accroît la complexité des déploiements et la difficulté de développement des API
  • Découper avant même qu’un véritable goulot d’étranglement n’apparaisse rend le système plus instable et plus lent
  • Simuler un futur découpage via des flags ou des toggles internes, plutôt que lancer précipitamment des travaux d’infrastructure, permet d’explorer des frontières organiques plus efficacement
  • Leçon : les décisions de découpage doivent reposer sur les vrais goulots d’étranglement, pas sur la théorie

2. Trop de dépôts et trop d’infrastructure

  • Style de code, tests, configuration, documentation, CI/CD : chaque élément se multiplie avec le nombre de services
  • Une structure en monorepo permet de gérer toute la configuration au même endroit, d’améliorer la cohérence du code et l’efficacité de la collaboration
  • Dans l’écosystème Node.js, des outils comme nx ou turborepo facilitent la gestion des dépendances et des builds entre services internes
  • Parmi les inconvénients : dépendances complexes, besoin d’optimiser les performances de la CI, nécessité d’outils de build plus rapides
  • Dans l’écosystème Go aussi, il est possible de commencer avec un workspace unique puis d’envisager un découpage en modules lorsque la taille augmente
  • Leçon : une petite équipe peut gagner du temps grâce à un monorepo et une infrastructure partagée

3. Un environnement de développement local instable

  • Temps de lancement excessif en local, scripts complexes, dépendances propres à chaque système : tout cela provoque des retards d’onboarding et une baisse de productivité
  • Le manque de documentation, les problèmes de compatibilité et les bricolages spécifiques à un OS (par exemple des scripts réservés à macOS) deviennent des obstacles
  • Sur un projet, un proxy Node.js a permis d’atténuer la complexité de Docker et de réduire le temps d’onboarding des développeurs
  • Leçon : si l’application ne tourne que sur un seul OS, la productivité de l’équipe finit par dépendre de la fiabilité d’un seul laptop

4. Des stacks techniques incohérentes

  • Node.js et Python sont adaptés à l’itération rapide, mais dans un environnement de microservices, ils provoquent souvent des problèmes de désalignement entre build et runtime
  • Go présente des avantages grâce aux binaires statiques, à la rapidité des builds et à la simplicité d’exploitation
  • Il faut choisir sa stack avec soin dès le début et, si nécessaire, combiner plusieurs langages via des protocoles comme gRPC
  • Sauf besoins particuliers comme le ML ou l’ETL, mélanger les stacks ne fait généralement qu’ajouter de la complexité
  • Leçon : choisissez une stack adaptée à la réalité de l’équipe, pas à une vision idéalisée

5. Complexité cachée : communication et monitoring

  • Avec les microservices, des éléments comme la service discovery, le versionnement des API, le distributed tracing et la gestion centralisée des logs deviennent indispensables
  • Le suivi d’un bug ou d’un incident, qui peut se résumer à une stack trace dans un monolithe, devient bien plus complexe dans un environnement distribué
  • Pour bien faire, il faut introduire des outils spécialisés comme OpenTelemetry et mettre en place une véritable stack d’observabilité
  • Il faut reconnaître qu’un système distribué implique un investissement obligatoire dans des défis d’ingénierie supplémentaires

Quand les microservices sont pertinents

  • Isolation des workloads : il peut être efficace de séparer certaines tâches asynchrones comme le traitement d’images ou l’OCR
  • Besoins de montée en charge asymétriques : si une API web et une charge ML ont des contraintes matérielles ou opérationnelles différentes, il est pertinent de les séparer
  • Besoin d’un autre runtime : des composants incompatibles avec le runtime principal de l’application, comme du code C++ legacy, peuvent être maintenus comme services distincts
  • Comme le montrent les grandes organisations d’ingénierie (par exemple Uber), cela n’est adapté que lorsqu’il existe un besoin organisationnel évident et une capacité d’exploitation mature
  • Même dans une petite équipe, le découpage peut parfois être pratique pour un service externe d’analyse facile à gérer
  • Leçon : n’adoptez les microservices que pour des workloads où l’avantage du découpage est concrètement évident

Guide pratique pour les startups

  • Commencez par un monolithe et concentrez-vous sur le travail avec un framework éprouvé
  • Un dépôt unique est plus avantageux pour une équipe au début, du point de vue de l’exploitation, de la gestion et de la sécurité
  • La simplification de l’environnement de développement local est cruciale ; si cela reste difficile, il faut fournir une documentation détaillée et des vidéos explicatives
  • Investissez tôt dans la CI/CD pour automatiser les tâches répétitives et réduire la charge mentale de l’équipe
  • Ne découpez de manière sélective que lorsqu’un goulot d’étranglement clair apparaît ; sinon, concentrez-vous sur la modularisation interne du monolithe et le renforcement des tests
  • L’objectif prioritaire est de préserver la vitesse de développement
  • Leçon : partez de la simplicité et scalez en fonction du besoin réel de séparation

Si vous devez absolument utiliser des microservices

  • Évaluer la stack technique et investir dans l’expérience développeur : il faut prévoir de l’automatisation par service, des scripts clairs et des outils de gestion unifiée des déploiements
  • Mettre en place des protocoles de communication fiables et standardisés entre services : cohérence des schémas de messages, documentation, gestion des erreurs et autres éléments supplémentaires à implémenter
  • Stabiliser l’infrastructure de test : les tests unitaires, d’intégration et E2E doivent pouvoir s’étendre au découpage en services
  • Réfléchir aux bibliothèques communes : garder au minimum le code partagé lié à l’observabilité et à la communication afin d’éviter des rebuilds fréquents de tous les services
  • Introduire l’observabilité tôt : commencer au minimum par des logs JSON structurés, des identifiants de corrélation et des outils de logging de base
  • En conclusion, si l’on accepte la complexité, il est essentiel de concevoir un système maîtrisable avec une discipline rigoureuse

Conclusion

  • Une adoption précipitée des microservices ne laisse qu’un fardeau supplémentaire ; il faut donc privilégier avant tout la simplicité
  • Il est important de ne pas découper sans point de douleur évident, et de n’ajouter que la complexité minimale nécessaire pour survivre et croître
  • La survie d’abord, l’expansion ensuite

10 commentaires

 
kuil09 2025-05-12

Je suis globalement d’accord avec le propos de l’article original.
Je pense que c’est surtout une question d’expérience de l’organisation.
On peut imaginer qu’on commence par vendre de la nourriture dans un food truck avant de devenir un restaurant.
Dès le départ, l’expérience des parties prenantes est tout simplement insuffisante pour envisager une division du travail et une spécialisation.

 
dhlee0305 2025-05-12

Je pense que les startups doivent choisir des approches moins coûteuses afin de prolonger leur durée de survie. Les microservices ne sont absolument pas bon marché. En pratique, lorsqu’on les applique sur le terrain, ils engendrent des coûts considérables. Dans la mesure du possible, concevoir une architecture adaptée à son propre service me semble être un moyen d’obtenir des effets similaires à moindre coût.
Je ne dis pas que les microservices sont mauvais. C’est un modèle qui nécessite beaucoup de moyens.

 
mhj5730 2025-05-12

Je pense qu’il suffit d’avoir seulement deux monolithes : un monolithe purement synchrone et un monolithe purement asynchrone... À mon avis, l’adoption des microservices dépend avant tout de l’ampleur des tables qu’il faut gérer en base de données. Si les tables sont absurdement nombreuses et complexes, il faut envisager une architecture MSA ; si c’est simple, le monolithe est parfaitement adapté.

 
roxie 2025-05-12

Quand toutes ces vagues seront passées, comment les générations futures se souviendront-elles de cette époque ?

 
n1ghtc4t 2025-05-12

À l’époque, c’était encore une autre vague...

 
bungker 2025-05-11

Je pense que les microservices ont aussi beaucoup d’avantages dans une startup. Déjà, je recommande vraiment les avantages d’utiliser un monorepo.

  • Quand l’orientation du produit change, avec les microservices, les parties à modifier sont plus claires et moins nombreuses qu’avec un monolithe. Je pense vraiment que c’est un point très important.
  • À l’ère du développement largement assisté par l’IA, la petite taille des microservices les rend plus faciles à développer avec l’IA. (Je ne dis pas que c’est impossible avec un monolithe.)
  • Je reconnais la charge de CI/CD, mais il y a aussi des services qui sont abandonnés à l’étape où l’on cherche encore la bonne direction. Même si on les met en place seulement une fois la direction finale définie, c’est presque du copier-coller, donc on peut les monter en moins d’une semaine.
  • Les open source qui excellent selon les langages sont très clairement identifiés. On peut par exemple faire la sécurité et la logique métier en Java, et l’IA en Python ; dans une architecture en microservices, on peut ainsi utiliser autant d’open source que possible selon leurs points forts.
 
andone 2025-05-11

Je suis d’accord sur le fait qu’à l’ère du développement centré sur l’IA, il est indispensable d’implémenter des composants de petite taille avec une responsabilité unique.

 
bus710 2025-05-10

Cela a aussi été brièvement mentionné dans les commentaires, mais l’écosystème beam/otp me paraît vraiment assez souple et intéressant. Dans le cas de Gleam, la bonne syntaxe de Go et de Rust, combinée à la stabilité de beam, en fait un langage assez impressionnant. J’aimerais bien commencer à l’utiliser petit à petit sur de petits projets.

 
ndrgrd 2025-05-10

Si on morcelle l’équipe à tout-va, ne serait-ce que se réunir pour échanger des avis devient déjà une charge de travail énorme.

 
GN⁺ 2025-05-10
Avis sur Hacker News
  • On se rend compte que sans vrais problèmes de passage à l’échelle, sans grande équipe ou sans domaine devant évoluer de manière indépendante, les microservices ne font qu’ajouter des coûts sans apporter de bénéfice ; Segment a d’ailleurs annulé sa séparation en microservices pour cette raison ; c’est davantage un modèle organisationnel qu’une technologie ; en général on exploite d’abord un monolithe unique, puis on ne sort en services séparés que le front, le backend ou les tâches longues (par ex. la génération de PDF) ; ensuite, quand le nombre de services augmente, on commence à réfléchir à la standardisation et à l’architecture ; en dessous de 200 ingénieurs, cela entraîne souvent une perte de productivité ; on ne survit pas grâce aux microservices, on survit malgré eux
    • Certains développeurs ont tendance à introduire des microservices pour embellir leur CV en vue d’un futur poste dans une grande entreprise ; dans une vraie startup cela aide rarement ; pour empêcher ce genre de dérive, il faut un leadership technique vraiment avisé
    • Témoignage d’une startup d’environ 50 ingénieurs ayant éclaté son système en des dizaines de services : il fallait au moins six mois à un nouvel arrivant pour comprendre l’ensemble, alors qu’il n’y avait que quelques centaines d’utilisateurs ; complexité énorme, 50 millions de dollars de financement VC brûlés, et au final échec total ; le produit était innovant et bien conçu, mais cela n’a servi à rien
    • Lors d’un découpage en services, il existe aussi une méthode consistant à ne pas scinder le code, mais à déployer un monolithe classique en séparant uniquement les rôles via des flags ; les workers de fond tournent avec le serveur web, avec health checks et métriques, et le load balancer répartit le trafic selon les rôles
    • Comme l’a montré le cas de Khan Academy, une fois le monolithe suffisamment monté en charge, l’expérience permet de mieux juger où placer les frontières entre services ; c’est à ce moment-là que l’adoption des microservices devient pertinente
    • On peut invoquer des raisons techniques pour justifier une séparation, mais un service reste par nature quelque chose de difficile ; si c’est nécessaire, l’important est d’adopter une posture d’apprentissage et de montée en compétence ; il ne faut pas rejeter automatiquement une approche simplement parce qu’elle est à la mode, il faut en évaluer les compromis
    • Le simple fait d’avoir « plusieurs équipes » ne justifie pas de tout découper ; pourtant certains directeurs veulent séparer le monolithe dès qu’apparaissent deux petites squads ; si les équipes sont réorganisées fréquemment (tous les 9 mois), fixer tôt des frontières d’architecture devient au contraire une catastrophe ; il faut d’abord vérifier qu’un domaine mérite d’être porté de façon stable par une même équipe pendant au moins 18 mois avant d’en faire une vraie frontière architecturale
    • La définition même des microservices porte à l’origine sur des « domaines pouvant évoluer indépendamment », donc cela ne paraît pas vraiment nouveau
    • Dans un cas très particulier, une seule URL avait des besoins de trafic et de mémoire très différents ; le serveur PHP n’était pas adapté, donc un serveur supplémentaire dans un autre langage a été ajouté, avec un gain de performance/coût de l’ordre de 1000x ; il peut être utile de repenser, à la Java/Spring/Guava, la notion de service selon qu’elle est implémentée « hors processus » ou « dans le processus » ; si l’on standardise bien la stack technique, les versions et la sérialisation, la productivité peut même augmenter, mais sans standardisation cela provoque chaos, erreurs de communication et problèmes de compatibilité
    • La loi de Conway (la structure du code reflète la structure de l’organisation) se vérifie réellement en pratique
    • Un service est quelque chose fourni par des personnes ; les microservices seraient donc des services dans l’économie interne de l’entreprise
    • Retour d’expérience d’il y a 15 ans : une petite équipe exploitait facilement une solution unique, puis après le passage aux microservices elle a dû gérer le démarrage et la coordination de chaque service, avec beaucoup de difficultés ; cela a fait comprendre l’importance de YAGNI (ne pas construire avant d’en avoir besoin)
    • Il existe de nombreuses raisons techniques de séparer certaines parties, par exemple les chemins très sollicités ou critiques ; ce n’est en général pas souhaitable dans une petite organisation, mais isoler uniquement les parcours à forte charge peut avoir un effet important même dans une startup
    • En pratique, le principal avantage des microservices est de permettre à de petits groupes de travailler indépendamment sans trop se gêner ; mais comme plusieurs équipes possèdent chacune leurs microservices, les réunions de standardisation n’en finissent plus, et l’habileté diplomatique consistant à dire « ce n’est pas notre problème » devient parfois plus importante que la coopération
  • Dans une équipe de 2 à 3 développeurs, l’adoption des microservices a été décidée parce que cela avait l’air cool malgré les avertissements ; deux ans plus tard, il a fallu reconstruire le code existant, et trois ans après ils n’avaient toujours pas résolu les problèmes de déploiement et autres ; s’ils avaient choisi dès le départ un monolithe modulaire, ils auraient évité cela ; forte adhésion au constat de cet article
    • Si quelqu’un laisse derrière lui un projet tape-à-l’œil sur son CV puis change vite d’entreprise, les conséquences retombent sur les autres
    • Les microservices ne deviennent vraiment utiles que lorsqu’il y a effectivement une équipe dédiée par service ; quand une même équipe doit maintenir plusieurs services, on voit rarement de bons résultats
    • Une grande partie des problèmes vient du fait que les équipes continuent à considérer les microservices comme un seul système, c’est-à-dire comme un monolithe ; cela crée des frictions de la conception au déploiement ; pour réussir, il faut une adhésion claire de toute l’organisation ; transformer un système existant en microservices suscite souvent une forte résistance interne
    • Au final, on a l’impression que les startups finissent toutes par traverser des galères similaires
    • Même sur un projet d’interface interne composé de 8 à 12 microservices, avec seulement 5 à 10 utilisateurs réels, la complexité a grossi inutilement ; on ne voit pas pourquoi
    • Expérience d’une adoption de microservices + Java sous l’influence de consultants Thoughtworks : le cabinet est reparti après avoir été payé, tandis que l’organisation s’est perdue à réimplémenter un monolithe riche en fonctionnalités sous forme de microservices distribués ; le projet a échoué et l’entreprise a disparu ; depuis, grande méfiance envers les grands cabinets de conseil
  • Version « cerveau grug » : pourquoi choisir volontairement une approche plus difficile qui découpe le système et ajoute en plus des appels réseau ?
    • Cela ressemble à l’idée d’ajouter un mécanisme de « monkey patch » dans un langage qui, comme Python, ne l’a pas nativement
    • Selon un avis, l’appel réseau transforme une simple règle en véritable loi
    • Avec l’humour grug : de plus en plus de grugs au cerveau grug finissent par croire à tort qu’un groupe de 9 grugs peut produire un bébé grug en un mois
  • Les microservices sont efficaces dans les grandes organisations pour résoudre des problèmes humains, supprimer des obstacles bureaucratiques et donner plus d’autonomie aux développeurs ; dans une petite startup, le bénéfice réel est limité ; cela dit, si un domaine spécifique impose un mélange de stacks techniques (par ex. Elixir avec Python/Go), ce type de séparation peut devenir nécessaire
    • Si certaines parties de l’application ont des charges ou des besoins en ressources très différents, créer un service séparé peut aussi être avantageux dans une petite startup ; il vaut mieux laisser l’essentiel de la logique métier dans un monolithe et n’isoler que les tâches spéciales, comme celles liées au GPU ; en revanche, il faut éviter que ce modèle ne dérive vers l’entretien de 100 services ; par défaut, préférence pour le monolithe, et séparation uniquement au moment nécessaire
    • Les microservices créent au contraire de nouvelles dépendances organisationnelles et de nouveaux besoins de coordination ; par exemple, une politique consistant à dire « n’importe qui peut reprendre n’importe quel service » augmente fortement la maintenance, car tout le monde doit être capable de tout comprendre ; on finit alors par consacrer son temps à chercher les bonnes personnes
    • Quand des équipes se chevauchent, se contredisent ou dupliquent des efforts, l’inefficacité augmente
  • Dans l’architecture logicielle, les microservices ressemblent à une mise en pratique de la loi de Conway : chaque frontière d’équipe devient une frontière à franchir, et créer artificiellement de grandes frontières internes est le plus souvent contre-productif ; à la place, on peut gérer cela avec un monolithe modulaire via l’injection de dépendances, la conception de frontières de modules ou encore le modèle acteur ; si un vrai besoin apparaît plus tard, extraire des services devient alors plus simple ; cette approche a offert un bon rapport coût/efficacité, d’après une expérience de découpage de monolithe réalisée 3 à 4 fois
    • La loi de Conway porte sur les frontières de communication, pas sur la nécessité de les matérialiser toutes dans le code ; au contraire, il faut souvent réorganiser l’entreprise pour l’adapter au logiciel, ce qui reviendrait à faire une réorg à chaque changement d’architecture ; cette logique accentue la déconnexion entre équipes et objectifs métier ; inutile donc d’idéaliser aveuglément le modèle d’Amazon
  • D’un point de vue technique, les cas où les microservices conviennent à une startup sont surtout : (1) lorsqu’un langage différent est indispensable à côté de l’application cœur (par ex. Rails + R), (2) lorsqu’une partie seulement a des besoins d’échelle radicalement différents, (3) lorsqu’un certain type de données a des exigences de sécurité ou de rétention très distinctes (données médicales, etc.) ; en dehors de cela, il y a rarement une bonne raison d’aller si loin dans le découpage, et une petite organisation y perd plutôt qu’elle n’y gagne
    • Diviser quelques services n’est pas la même chose que faire de « vrais » microservices ; les vrais microservices consistent à externaliser même ce qui, dans une application classique, serait resté un simple module
    • Au-delà de l’échelle, si les exigences de fiabilité ou de disponibilité diffèrent de façon extrême, une séparation en services distincts peut aussi se justifier ; cela permet une séparation des préoccupations au service des SLA, avec moins de risques et des déploiements plus rapides
    • Même dans ce cas, certains estiment que cela ne diffère pas tant que ça du fait d’exploiter simplement un serveur de base de données séparé
  • Le vrai résultat des microservices est organisationnel : on découpe le problème pour qu’une équipe possède complètement une partie donnée et soit responsable de la livraison de bout en bout, ce qui permet une spécialisation ; les changements deviennent naturellement incrémentaux et l’API est l’unique point d’interaction ; il n’y a ni base de données, ni système de fichiers, ni API partagés ; en contrepartie, la standardisation et les outils de gestion (monitoring, tests, CI/CD compris) deviennent essentiels, même si, d’une certaine manière, ce sont aussi des besoins qu’un monolithe finit par avoir
    • L’infra, les logs ou l’authentification peuvent être packagés ou gérés via gRPC, des files de messages, etc. ; créer un nouveau service devient rapide, les merge requests au sein d’une équipe restent plus petites, les conflits diminuent et la productivité augmente ; à l’époque d’équipes de 5 à 10 personnes, le monolithe provoquait souvent conflits, déploiements difficiles et problèmes de release, alors qu’après la bascule vers les microservices la productivité, la collaboration et même les README se sont améliorés ; mais cela supposait des règles strictes sur les tests, la documentation et les endpoints
    • Il peut aussi y avoir des raisons techniques, par exemple autour des bases de données ou des performances, de séparer certains éléments ; toutefois, dans une startup classique, cela reste plutôt rare
  • L’un des points forts de l’écosystème BEAM/OTP (Erlang, Elixir), c’est qu’il permet de conserver un monolithe tout en s’exerçant à une conception « façon microservices », puis de basculer facilement vers une vraie séparation quand cela devient nécessaire ; à petite échelle on garde les avantages du monolithe, et quand le système grandit on peut obtenir en même temps montée en charge et indépendance ; cela demande toutefois d’apprendre les objets immuables, la communication concurrente et la gestion des pannes, sans compter que le recrutement peut être plus difficile
  • Beaucoup sont d’accord : dans un contexte startup, il est presque impossible de définir correctement les frontières de services ; cela dit, dans une petite équipe, les microservices peuvent parfois être bénéfiques à cause d’API externes ou de dépendances complexes ; dans ce cas, la frontière réseau est déjà imposée, donc faire un service séparé n’ajoute pas énormément de complexité ; de même, lorsqu’il y a des difficultés de build ou de déploiement, la séparation peut simplifier le monolithe
  • Les microservices ne sont adaptés que lorsqu’il faut gérer une très forte échelle ou un besoin important de micro-management des équipes ; il ne faut en revanche jamais renoncer à des frontières de modules claires ; il est possible de retrouver certains avantages des microservices au sein d’un monolithe grâce à une approche objet orientée message passing ; il faut aussi s’entraîner à ne pas accéder directement à la base de données ; dans des langages comme Java, on peut structurer cela via la modularité, des namespaces de schéma de base de données et l’exposition d’interfaces minimales, avec tests et monitoring indépendants, tout en gardant la facilité de déployer plusieurs services ensemble
    • Une fois les frontières logiques bien comprises, on peut aussi les faire respecter avec des outils comme ArchUnit