Vol. 6 · № 02 · Un atelier d'architectureAn architecture workshop

Microservices, ou la frontière qu'on paie en réseauMicroservices, or the boundary you pay for in network

Le #1 a tracé la frontière en logique ; ce numéro la transforme en frontière réseau — l'appel qui était en mémoire devient un appel HTTP. Sauf que le réseau n'est pas une fonction : il peut être lent, échouer à moitié, ou répondre deux fois. Un microservice s'achète : ce qu'on obtient — le déploiement indépendant — répond à un problème d'organisation, pas à une vertu technique ; ce qu'on paie est réel (le réseau devient le bug, l'ACID se mue en cohérence éventuelle). Le piège des deux côtés : la granularité absurde et le démarrage prématuré. On n'extrait un service que quand la douleur le justifie — pas avant.Issue #1 drew the boundary in logic; this one turns it into a network boundary — the in-memory call becomes an HTTP call. Except the network isn't a function: it can be slow, fail halfway, or answer twice. A microservice is bought: what you get — independent deployment — answers an organizational problem, not a technical virtue; what you pay is real (the network becomes the bug, ACID turns into eventual consistency). The trap on both sides: absurd granularity and premature start. You extract a service only when the pain justifies it — not before.

AudienceAudience
Dev tenté de découper en services parce que « c'est l'architecture »Dev tempted to split into services because 'it's the architecture'
Format
Self-paced
ChapitresChapters
5
Date
Juin 2026June 2026
≈ 18 min●●●○Découper le systèmeMicroservicesDistribuéTradeoff
SommaireContents ·
№ 01CadrageFraming3 min

On découpe en services. Qu'est-ce qu'on achète, et qu'est-ce qu'on paie ?You split into services. What do you buy, and what do you pay?

Le #1 a tracé la frontière en logique ; ce numéro la transforme en frontière réseau. Le geste a l'air anodin — l'appel qui était en mémoire devient un appel HTTP — mais on l'écrit comme s'il restait une fonction locale : totale, instantanée, sûre. Or le réseau n'est pas une fonction. Ce qui varie d'un système à l'autre, ce n'est pas le nombre de services : c'est si l'on a une vraie raison de payer ce qu'ils coûtent. Le réflexe : nommer ce qu'on achète — le déploiement indépendant — et ce qu'on paie — le réseau devient le bug —, et n'extraire un service que lorsque la première colonne pèse plus lourd que la seconde.Issue #1 drew the boundary in logic; this one turns it into a network boundary. The move looks innocuous — the call that was in-memory becomes an HTTP call — but you write it as if it were still a local function: total, instant, safe. Yet the network is not a function. What varies between systems isn't the number of services: it's whether you have a real reason to pay what they cost. The reflex: name what you buy — independent deployment — and what you pay — the network becomes the bug —, and extract a service only when the first column outweighs the second.

Le code naïf — un appel réseau écrit comme un appel localThe naive code — a network call written like a local one
# on "passe en microservices" : facturation devient un service à part.
# l'appel qui était en mémoire devient un appel réseau — mais on l'écrit pareil :
def checkout(order_id):
    price = http.get(f"http://billing/invoices/{order_id}").json()["amount"]
    #        ^^^^ traité comme un appel de fonction local : total, instantané, sûr
    charge(order_id, price)

# sauf que le réseau n'est PAS une fonction :
#   - il peut être lent (le service met 8s à répondre)
#   - il peut échouer à moitié (timeout : a-t-il facturé, oui ou non ?)
#   - il peut répondre deux fois (le retry double la charge)
# le déploiement indépendant, on l'a acheté. ces trois lignes, on les paie.
L'appel local vs l'appel réseauThe local call vs the network call
appel locallocal call
total · instantané · sûrtotal · instant · safe
→
devientbecomes
appel réseaunetwork call
lent · partiel · dupliquéslow · partial · duplicated

Une fonction locale, on l'appelle et elle répond — ou elle lève une exception, ici, maintenant. Un appel réseau peut être lent, échouer à moitié (a-t-il facturé avant le timeout ?), ou réussir deux fois. Les microservices n'ajoutent pas un peu de latence : ils changent la nature de chaque appel entre services. C'est ça, le prix — et il ne se paie qu'à la frontière réseau, jamais à la frontière logique.A local function: you call it and it answers — or it throws, here, now. A network call can be slow, fail halfway (did it charge before the timeout?), or succeed twice. Microservices don't add a bit of latency: they change the nature of every call between services. That's the price — and it's only paid at the network boundary, never at the logical one.

Le réflexe du volumeThe volume's reflex

« Cette frontière suit-elle une vraie couture métier, ou juste un découpage technique ? » Pour un microservice, la question devient : ai-je une raison concrète de payer le réseau ? Ce qu'on achète est précis — déployer, scaler, choisir sa techno indépendamment, par équipe — et c'est réel quand une organisation grandit. Ce qu'on paie l'est tout autant : chaque appel inter-services peut être lent, partiel ou dupliqué, et la cohérence forte d'une transaction locale disparaît. Le réflexe n'est pas « découpe en services parce que c'est moderne » : c'est « extrais un service quand la douleur le justifie — une équipe bloquée, une charge à isoler — pas avant ».'Does this boundary follow a real business seam, or just a technical split?' For a microservice, the question becomes: do I have a concrete reason to pay for the network? What you buy is precise — deploy, scale, choose your tech independently, per team — and it's real when an organization grows. What you pay is just as real: every inter-service call can be slow, partial or duplicated, and a local transaction's strong consistency vanishes. The reflex isn't 'split into services because it's modern': it's 'extract a service when the pain justifies it — a blocked team, a load to isolate — not before'.

Ce numéro prend le contre-pied de la mode.This issue goes against the fashion.

« Microservices » a longtemps été synonyme de « bien fait ». C'est faux : ce sont une réponse organisationnelle à un problème d'échelle — plusieurs équipes qui se gênent dans un même déployable —, pas une vertu technique. On ne commence presque jamais en microservices ; on y arrive, depuis un monolithe modulaire (#1), quand une frontière logique déjà nette mérite enfin de devenir une frontière réseau. Commencer là, c'est payer le réseau avant d'avoir la douleur qui le justifie : le distributed monolith du numéro précédent.'Microservices' was long a synonym for 'done right'. It's false: they're an organizational answer to a scaling problem — several teams stepping on each other in one deployable —, not a technical virtue. You almost never start in microservices; you arrive there, from a modular monolith (#1), when an already-crisp logical boundary finally deserves to become a network boundary. Starting there means paying for the network before having the pain that justifies it: the previous issue's distributed monolith.

№ 02La douleurThe pain4 min

Le réseau devient le bug, et la transaction d'hier n'existe plus.The network becomes the bug, and yesterday's transaction is gone.

Découper en services avant d'en avoir besoin a trois coûts qui se renforcent. L'appel inter-services échoue de façons nouvelles : lenteur, timeout, panne partielle — et chaque appel local est devenu un point de défaillance qu'il faut prévoir. La cohérence forte disparaît : ce qui tenait dans une transaction de base de données (« débite ET marque payé, tout ou rien ») s'étale maintenant sur deux services qui peuvent diverger. Et l'observation se fragmente : un bug ne vit plus dans une stack trace mais dans une trace distribuée à travers cinq services, des logs éparpillés, des horloges qui ne s'accordent pas. Le réseau ne se contente pas d'ajouter de la latence ; il rend possibles des pannes qui n'existaient tout simplement pas.Splitting into services before you need them has three costs that reinforce each other. The inter-service call fails in new ways: slowness, timeout, partial failure — and every local call has become a failure point you must plan for. Strong consistency disappears: what held in a database transaction ('charge AND mark paid, all or nothing') now spreads across two services that can diverge. And observation fragments: a bug no longer lives in a stack trace but in a distributed trace across five services, scattered logs, clocks that don't agree. The network doesn't merely add latency; it makes possible failures that simply didn't exist.

№ 1 · Le réseau devient le bugThe network becomes the bug

Chaque appel qui était un saut en mémoire est maintenant un aller-retour qui peut être lent, expirer, ou échouer à moitié. Le timeout est le pire : le service distant a-t-il traité la demande avant de ne pas répondre ? On ne sait pas. Des pannes qui n'existaient pas dans le monolithe deviennent le quotidien.Every call that was an in-memory hop is now a round-trip that can be slow, time out, or fail halfway. The timeout is the worst: did the remote service process the request before failing to answer? You don't know. Failures that didn't exist in the monolith become routine.

№ 2 · La cohérence forte disparaîtStrong consistency disappears

Dans un monolithe, « débiter et marquer la commande payée » tient dans une transaction : tout ou rien. Réparti sur deux services, ce garde-fou n'existe plus — l'un peut réussir, l'autre échouer, et il faut compenser à la main. La transaction ACID devient une cohérence éventuelle qu'on gère soi-même (Saga, Vol 7).In a monolith, 'charge and mark the order paid' fits in one transaction: all or nothing. Spread over two services, that guardrail is gone — one can succeed, the other fail, and you must compensate by hand. The ACID transaction becomes an eventual consistency you manage yourself (Saga, Vol 7).

№ 3 · L'observation se fragmenteObservation fragments

Un bug ne se lit plus dans une stack trace : il faut le reconstituer à travers cinq services, leurs logs séparés, leurs métriques, leurs horloges désynchronisées. Sans tracing distribué, corrélation d'IDs et agrégation centralisée, « pourquoi cette commande a échoué ? » devient une enquête de plusieurs heures.A bug no longer reads in a stack trace: you reconstruct it across five services, their separate logs, their metrics, their unsynced clocks. Without distributed tracing, ID correlation and centralized aggregation, 'why did this order fail?' becomes a multi-hour investigation.

Un timeout, et une question sans réponse : a-t-il débité, oui ou non ?A timeout, and a question with no answer: did it charge, yes or no?
def checkout(order_id):
    mark_paid(order_id)                                  # service commandes : OK
    resp = http.post("http://billing/charge", ...)       # 💥 timeout après 8s
    # le débit a-t-il eu lieu ? on n'en sait RIEN :
    #   - non → la commande est "payée" mais rien n'est débité
    #   - oui → on retente, et on débite le client DEUX fois
    # dans un monolithe, une transaction réglait ça. ici, c'est à nous de gérer.
Le diagnostic.The diagnosis.

Le détecteur : « ai-je une raison concrète — une équipe bloquée, une charge à isoler, une techno à séparer — qui justifie de payer le réseau sur cet appel ? ». Si la seule réponse est « c'est plus moderne » ou « ça scalera un jour », la frontière réseau est prématurée. Le réflexe : garder la frontière en logique (le monolithe modulaire du #1) tant que la douleur organisationnelle n'est pas là, et n'extraire un service que quand son bénéfice — déployer et scaler seul — dépasse clairement son coût — réseau faillible, cohérence éventuelle, observation distribuée. On extrait pour soulager une douleur réelle, jamais pour suivre une mode.The detector: 'do I have a concrete reason — a blocked team, a load to isolate, a tech to separate — that justifies paying for the network on this call?'. If the only answer is 'it's more modern' or 'it'll scale one day', the network boundary is premature. The reflex: keep the boundary in logic (issue #1's modular monolith) until the organizational pain is real, and extract a service only when its benefit — deploy and scale alone — clearly exceeds its cost — fallible network, eventual consistency, distributed observation. You extract to relieve a real pain, never to follow a fashion.

№ 03La ligne réseauThe network line5 min

On promeut la frontière logique en frontière réseau — et on en compte le prix.Promote the logical boundary to a network one — and count the price.

Un microservice, c'est une frontière logique qu'on a décidé de payer en réseau. L'animation part du monolithe modulaire où l'appel est en mémoire, coupe pour montrer ce qu'on achète — le déploiement indépendant —, fait traverser l'appel sur le fil pour montrer ce qu'on paie — lenteur, panne partielle, double réponse, fin de la transaction partagée —, puis pose la condition : la ligne ne se trace que si une douleur concrète en couvre le coût. On n'achète pas le réseau parce qu'il est moderne ; on l'achète quand son bénéfice dépasse son prix.A microservice is a logical boundary you decided to pay for in network. The animation starts from the modular monolith where the call is in-memory, cuts to show what you buy — independent deployment —, sends the call across the wire to show what you pay — slowness, partial failure, double answer, the end of the shared transaction —, then sets the condition: the line is drawn only if a concrete pain covers its cost. You don't buy the network because it's modern; you buy it when its benefit exceeds its price.

Animation — de l'appel en mémoire à la ligne réseau méritéeAnimation — from the in-memory call to the earned network line
Départ — frontière logique, appel en mémoireStart — logical boundary, in-memory call · 1/4
commandesorders
en mémoirein-memory▸
facturationbilling
un seul déployableone deployable
appel total · instantané · sûr · coût nulcall total · instant · safe · zero cost
Le monolithe modulaire du #1 : commandes et facturation sont des modules nets, mais dans un seul process. L'appel entre eux est en mémoire — total, instantané, sûr. La frontière est déjà là ; elle ne coûte rien.Issue #1's modular monolith: orders and billing are crisp modules, but in one process. The call between them is in-memory — total, instant, safe. The boundary is already there; it costs nothing.

Le même appel, mais qui peut échouer — 2 lignes à retrouverThe same call, but it can fail — 2 lines to recall
# un appel inter-services se traite comme faillible, pas comme une fonction locale                      idempotency_key=order_id,   # rejouable sans double débit (Vol 7)# et la cohérence "payé + débité" n'est plus une transaction : c'est une saga,
# avec une compensation si l'un des deux côtés échoue. le réseau impose ce surcoût.
2 ligne(s) à retrouver — écris-la de tête avant de cliquer2 line(s) to recall — write it in your head before clicking
Le motif transférable.The transferable pattern.

« Une frontière réseau s'achète : elle offre l'indépendance de déploiement, et facture chaque appel en faillibilité. » C'est le même calcul pour un microservice, une API tierce, une file de messages, une lecture de cache distant. Partout où un appel franchit un processus, il cesse d'être total et instantané : il faut un timeout, une idempotence, une stratégie d'échec, une cohérence pensée. Le réflexe transférable n'est pas « distribue » mais « avant de mettre du réseau entre deux bouts de code, demande-toi ce que ce réseau t'achète — et accepte d'en payer le prix en entier ».'A network boundary is bought: it offers deployment independence, and bills every call in fallibility.' It's the same calculus for a microservice, a third-party API, a message queue, a remote cache read. Anywhere a call crosses a process, it stops being total and instant: you need a timeout, idempotency, a failure strategy, a thought-through consistency. The transferable reflex isn't 'distribute' but 'before putting a network between two pieces of code, ask what that network buys you — and accept paying its price in full'.

Modèle mentalMental model
L'imageThe image

Extraire un microservice, c'est installer un colocataire dans son propre appartement : il gagne son autonomie — il refait sa cuisine sans te demander —, mais désormais lui parler passe par la rue. Un appel qui peut sonner dans le vide, couper en pleine phrase, ou aboutir deux fois.Extracting a microservice is moving a roommate into their own apartment: they gain autonomy — they redo their kitchen without asking — but now talking to them goes through the street. A call that can ring out, cut off mid-sentence, or connect twice.

La règleThe rule

Un microservice s'achète : il paie l'indépendance de déploiement en rendant chaque appel faillible — lent, partiel, dupliqué. On n'extrait que lorsqu'une douleur concrète couvre ce prix.A microservice is bought: it pays for deployment independence by making every call fallible — slow, partial, duplicated. You extract only when a concrete pain covers that price.

Où l'analogie casseWhere the analogy breaks

Déménager (séparer le déploiement) ne rend pas modulaire (séparer la logique) : ce sont deux axes indépendants — tout le quadrant du Vol 6. Deux colocataires dans des appartements séparés qui partagent encore un seul compte en banque — les mêmes tables — ne sont pas indépendants ; ils ont juste mis la rue entre eux. C'est le monolithe distribué : déploiement séparé, modularité nulle.Moving out (separating deployment) doesn't make you modular (separating logic): they're two independent axes — the whole Vol 6 quadrant. Two roommates in separate apartments still sharing one bank account — the same tables — aren't independent; they just put the street between them. That's the distributed monolith: separate deployment, zero modularity.

№ 04Le piègeThe trap4 min

Plus de services n'est pas mieux. La granularité qu'on n'a pas méritée.More services isn't better. The granularity you didn't earn.

Le piège n'est pas le microservice — c'est d'en faire un par entité technique, sans qu'aucune douleur ne le justifie. On découpe « commande », « utilisateur », « adresse », « prix », « taxe » en services distincts parce que « c'est l'architecture », et afficher une seule commande devient sept appels réseau en cascade : si l'un expire, la page tombe. Ces services changent toujours ensemble et se déploient ensemble — on a donc la latence et les pannes du réseau sans le déploiement indépendant qu'on était censé acheter. La granularité fine ne rend pas le système modulaire ; elle distribue son couplage. Bascule le toggle : compte les appels réseau qu'exige une seule action utilisateur.The trap isn't the microservice — it's making one per technical entity, with no pain to justify it. You split 'order', 'user', 'address', 'pricing', 'tax' into separate services because 'it's the architecture', and showing a single order becomes seven cascading network calls: if one times out, the page falls. These services always change together and deploy together — so you have the latency and failures of the network without the independent deployment you were supposed to buy. Fine granularity doesn't make the system modular; it distributes its coupling. Flip the toggle: count the network calls one user action demands.

# on extrait UN service, pour une douleur réelle, et on traite le réseau comme faillible
# facturation : équipe dédiée, charge à isoler → la ligne réseau se justifie
class OrdersService:
    def checkout(self, order_id):
        try:
            billing.charge(order_id, amount,
                           idempotency_key=order_id,   # rejouable sans double débit
                           timeout=2.0)                 # on borne l'attente
        except BillingTimeout:
            saga.compensate(order_id)                   # la cohérence est gérée, pas supposée
# une frontière, un vrai motif (équipe + charge), un appel pensé comme pouvant échouer.
Pourquoi c'est justeWhy it's right

On a extrait un seul service, pour une raison nommable : facturation a une équipe dédiée et une charge à isoler — le bénéfice du déploiement indépendant dépasse clairement le coût du réseau. Et l'appel est traité pour ce qu'il est : faillible. Une clé d'idempotence le rend rejouable sans double débit, un timeout borne l'attente, et la cohérence « payé + débité » est gérée explicitement par une compensation, pas supposée comme dans une transaction locale. La frontière suit une vraie couture métier (issue du monolithe modulaire), et chaque coût du réseau a sa parade. C'est un microservice qui se paie ce qu'il coûte parce qu'il rapporte davantage.You extracted one service, for a nameable reason: billing has a dedicated team and a load to isolate — the benefit of independent deployment clearly exceeds the network's cost. And the call is treated for what it is: fallible. An idempotency key makes it replayable without double-charging, a timeout bounds the wait, and the 'paid + charged' consistency is handled explicitly by compensation, not assumed as in a local transaction. The boundary follows a real business seam (out of the modular monolith), and each network cost has its counter. It's a microservice that pays its cost because it returns more.

La règle qui tranche.The rule that settles it.

Extrais un service quand son bénéfice est nommable — telle équipe se déploiera seule, telle charge se scalera à part, telle techno s'isolera — et seulement alors. Le test : « cette action utilisateur, combien d'appels réseau exige-t-elle, et ces services changent-ils ensemble ? ». Un appel, des services qui évoluent à des rythmes différents : la frontière est saine. Sept appels en cascade pour des services qui changent toujours ensemble : tu as découpé une couture qui n'existait pas, et tu paies le réseau pour rien. La granularité ne se choisit pas par esthétique ; elle se déduit des coutures métier et des frontières d'équipe.Extract a service when its benefit is nameable — this team will deploy alone, this load will scale apart, this tech will be isolated — and only then. The test: 'this user action, how many network calls does it require, and do these services change together?'. One call, services evolving at different rhythms: the boundary is healthy. Seven cascading calls for services that always change together: you split a seam that didn't exist, and you pay for the network for nothing. Granularity isn't chosen by aesthetics; it's deduced from business seams and team boundaries.

Le piège jumeau : commencer en microservices.The twin trap: starting in microservices.

L'autre excès, en amont : démarrer un produit neuf en microservices, avant de connaître ses vraies coutures. On fige des frontières réseau sur un domaine qu'on ne comprend pas encore — et chaque erreur de découpe se paie en migration distribuée. Le bon chemin est l'inverse : commencer en monolithe modulaire (#1), laisser les coutures se révéler à l'usage, et n'extraire un service que lorsqu'une frontière déjà nette rencontre une douleur concrète. On ne distribue pas pour apprendre à découper ; on découpe en logique, puis on distribue ce qui a mérité de l'être.The other excess, upstream: starting a new product in microservices, before knowing its real seams. You freeze network boundaries on a domain you don't yet understand — and every wrong cut is paid in distributed migration. The right path is the reverse: start in a modular monolith (#1), let the seams reveal themselves in use, and extract a service only when an already-crisp boundary meets a concrete pain. You don't distribute to learn how to split; you split in logic, then distribute what earned it.

№ 05Bilan & éditoWrap-up & editorial2 min

Des services par défaut, ou une frontière réseau qu'on a achetée.Services by default, or a network boundary you actually bought.

Monolithe modulaire vs microservices, côte à côteModular monolith vs microservices, side by side
monolithe modulairemodular monolithmicroservicesmicroservices
L'appelThe callen mémoire · sûrin-memory · saferéseau · failliblenetwork · fallible
DéploiementDeploymentuniquesingleindépendant (ce qu'on achète)independent (what you buy)
CohérenceConsistencytransaction ACIDACID transactionéventuelle · sagaeventual · saga
Un bugA bugune stack traceone stack tracetrace distribuéedistributed trace
Le bon momentThe right timele défautthe defaultquand la douleur le justifiewhen the pain justifies it

Quand ne pas découper en servicesWhen not to split into services

Le microservice s'achète, et le réseau se paie à chaque appel. On reste en monolithe (modulaire) — et c'est presque toujours correct au départ — quand :The microservice is bought, and the network is paid at every call. Stay in a (modular) monolith — and that's almost always right at first — when:

  • une seule équipe tient le produit : le déploiement indépendant n'a aucune valeur s'il n'y a personne à débloquer. Le bénéfice principal du microservice — des équipes qui ne se gênent plus — ne s'achète que quand la gêne existe.a single team owns the product: independent deployment has no value if there's no one to unblock. The microservice's main benefit — teams no longer stepping on each other — is bought only when the stepping-on exists.
  • la charge tient sur un déployable : tant qu'on n'a pas un composant dont le profil de charge diffère radicalement du reste, scaler le monolithe entier est plus simple et moins cher que d'isoler un service.the load fits on one deployable: until you have a component whose load profile differs radically from the rest, scaling the whole monolith is simpler and cheaper than isolating a service.
  • les coutures ne sont pas encore stables : sur un produit jeune, les frontières bougent à chaque sprint. Les figer en réseau, c'est payer une migration distribuée à chaque erreur de découpe. Laisse-les se révéler en logique d'abord.the seams aren't stable yet: on a young product, boundaries move every sprint. Freezing them in network means paying a distributed migration for every wrong cut. Let them reveal themselves in logic first.

Le réflexe n'est donc pas « découpe en microservices, c'est scalable » : c'est « ai-je une douleur concrète — une équipe, une charge, une techno — que seule une frontière réseau soulage ? Alors j'extrais ce service-là. Sinon, le monolithe modulaire reste plus sain. »So the reflex isn't 'split into microservices, it scales': it's 'do I have a concrete pain — a team, a load, a tech — that only a network boundary relieves? Then I extract that one service. Otherwise, the modular monolith stays healthier.'

Mot de l'éditeurFrom the editor

Ce numéro prend volontairement le contre-pied de la mode : on ne commence presque jamais en microservices. La leçon du volume tient en deux colonnes — ce qu'on achète (le déploiement indépendant, réponse à un problème d'organisation) et ce qu'on paie (le réseau devient le bug : lenteur, panne partielle, double réponse, fin de la transaction). Un microservice n'est pas une frontière plus propre qu'un module ; c'est la même frontière, qu'on a décidé de payer en réseau parce qu'une douleur réelle l'exigeait. Le découper sans cette douleur, ou par entité technique, ne rend rien modulaire : ça distribue le couplage — le monolithe distribué qu'on aura nommé deux fois pour mieux le fuir.This issue deliberately goes against the fashion: you almost never start in microservices. The volume's lesson fits in two columns — what you buy (independent deployment, an answer to an organizational problem) and what you pay (the network becomes the bug: slowness, partial failure, double answer, the end of the transaction). A microservice isn't a cleaner boundary than a module; it's the same boundary, which you decided to pay for in network because a real pain demanded it. Splitting it without that pain, or by technical entity, makes nothing modular: it distributes the coupling — the distributed monolith we'll have named twice the better to flee it.

Avec lui se referme le Vol 6 — découper le système : le #1 a posé la frontière logique comme défaut sain, le #2 a montré ce qu'il en coûte de la promouvoir en frontière réseau. Mais une fois la ligne réseau tracée, une question reste entière, et c'est tout le Vol 7 : qu'est-ce qui se passe quand l'autre côté ne répond pas — ou répond deux fois ? On a vu le timeout sans réponse, le retry qui double un débit, la transaction qui n'existe plus. La résilience dans le distribué — retry, timeout, backoff, idempotence, circuit breaker, saga — est l'art de rendre normal ce que le réseau rend inévitable : l'échec partiel.With it Vol 6 closes — splitting the system: #1 laid the logical boundary as the healthy default, #2 showed what it costs to promote it to a network boundary. But once the network line is drawn, a question remains whole, and it's all of Vol 7: what happens when the other side doesn't answer — or answers twice? We've seen the answerless timeout, the retry that doubles a charge, the transaction that's gone. Resilience in the distributed world — retry, timeout, backoff, idempotency, circuit breaker, saga — is the art of making normal what the network makes inevitable: partial failure.

Les voisins que ce numéro débloqueThe neighbors this issue unlocks

  • SOA — l'ancêtre des microservices : découper le système en services orientés métier, mais souvent autour d'un bus central (ESB) lourd. Les microservices en gardent l'idée — des services à frontière métier — en rejetant le point central : chaque service est autonome, la logique vit aux extrémités, pas dans le tuyau.microservices' ancestor: splitting the system into business-oriented services, but often around a heavy central bus (ESB). Microservices keep the idea — services with a business boundary — while rejecting the central point: each service is autonomous, logic lives at the ends, not in the pipe.
  • Service mesh — l'infrastructure qui rend le réseau inter-services gérable : un proxy à côté de chaque service prend en charge retry, timeout, mTLS, observation, sans que le code métier les porte. La réponse opérationnelle aux coûts du chapitre 2 — utile précisément quand on a assez de services pour que ces coûts pèsent.the infrastructure that makes the inter-service network manageable: a proxy beside each service handles retry, timeout, mTLS, observation, without the business code carrying them. The operational answer to chapter 2's costs — useful precisely when you have enough services for those costs to weigh.
  • Distributed monolith — l'anti-pattern nommé au #1 et confirmé ici : des services déployés séparément mais qui changent et se déploient toujours ensemble. Tous les coûts du réseau, aucun bénéfice. Le voisin qu'on cite pour le reconnaître tôt — c'est lui qui guette dès qu'on découpe sans couture ou avant la douleur.the anti-pattern named in #1 and confirmed here: services deployed separately but that always change and deploy together. All the network's costs, no benefit. The neighbor you cite to recognize it early — it lurks the moment you split without a seam or before the pain.

Le kata de décision — franchir le réseau, ou pas ?The decision kata — cross the network, or not?

Rien à implémenter : le geste qui ancre, c'est de trancher — et de nommer la douleur qui paie le réseau. Trois situations. Pour chacune, parie avant de dérouler : rester en monolithe modulaire, ou extraire un service ? Rappel du quadrant : séparer le déploiement ne rend pas modulaire — c'est un autre axe. La dernière question est la sournoise : elle porte sur l'ordre, monolithe d'abord ou microservices d'emblée ?Nothing to implement: the anchoring gesture is deciding — and naming the pain that pays for the network. Three situations. For each, bet before you scroll: stay a modular monolith, or extract a service? Quadrant reminder: separating deployment doesn't make you modular — that's a different axis. The last question is the sneaky one: it's about order, monolith first or microservices from the start?

# Le fil du Vol 6 : deux axes indépendants — modularité (design) × déploiement.
# La bonne case par défaut : haute modularité, UN déployable (le monolithe modulaire).
# Pour chaque situation : rester monolithe modulaire, ou franchir le réseau ?

SITU_A : monolithe modulaire sain · 1 équipe de 5 · charge homogène · coutures nettes
SITU_B : 3 équipes se marchent dessus sur un même déployable · déploiement = file d'attente
SITU_C : produit neuf · coutures encore inconnues · tenté de « démarrer en microservices »
Chez toi, cette semaine.In your codebase, this week.

Prends ton endpoint le plus fréquenté et compte ses appels inter-services synchrones sur le chemin critique : grep -rn "http.get\|requests.\|httpx\|fetch(" src/ | grep -iE "service|internal|:80[0-9][0-9]". Puis ouvre tes 20 dernières PR : combien touchent plus d'un dépôt de service à la fois ? Si une seule action déclenche cinq appels en cascade ET que ces services changent toujours ensemble, tu n'as pas des microservices : tu as un monolithe distribué. La question à poser, service par service : quelle douleur concrète — équipe, charge, techno — paie sa ligne réseau ?Take your busiest endpoint and count its synchronous inter-service calls on the critical path: grep -rn "http.get\|requests.\|httpx\|fetch(" src/ | grep -iE "service|internal|:80[0-9][0-9]". Then open your last 20 PRs: how many touch more than one service repo at once? If a single action triggers five cascading calls AND those services always change together, you don't have microservices: you have a distributed monolith. The question to ask, service by service: what concrete pain — team, load, tech — pays for its network line?