Architecture & System Design › Architecture Styles
Distributed Monolith
Microservices so coupled they must deploy together: the worst of both worlds.
Also known as: distributed monolith, monolith in disguise, distributed ball of mud
A distributed monolith pays microservices’ costs for a monolith’s benefits (i.e., none of either): separately deployed services that must release together, share a database, call each other synchronously in cascading chains — distribution’s latency, failure modes and operational burden with none of its independence.
"microservices": A ⇄ B ⇄ C (lockstep deploys, shared DB, sync chains)
reality: one system, N network hops of latency, N² failure paths
Symptoms diagnose it: coordinated releases (“we deploy the whole system on Fridays”), cross-service transactions, shared tables, version-locked APIs, and outages cascading through synchronous chains. The services are deployment theatre over a coupled design.
The classic mistakes:
- Splitting before boundaries exist. Decomposing along technical layers (UI service, logic service, data service) instead of domains guarantees coupling with hops. Boundaries follow business capabilities, not tiers.
- Shared database retained. Separate deploys over one schema keep every coupling that matters while adding network partitions. Data ownership first; deployment follows.
- Synchronous chains. A→B→C call graphs multiply latency and failure probability with each hop. Async boundaries and autonomy, or admit the monolith.
- Independent scaling theatre. Services that must scale together (locked request ratios) gain nothing from separate scaling. Scale units follow load independence.
- Conway denial. One team owning five “services” gets deployment pain without ownership benefit. Align services to teams that actually work independently.
- Rewriting to escape. A second distributed rewrite repeats the coupling with new tools. Consolidate first (modular monolith), then split along proven seams.
The escape: admit it (name the coupling honestly), consolidate logic into modules, split data ownership, then separate deployables along demonstrated seams. Distribution is earned by independence — never assumed into existence.