Avoiding Accidental Microservices in a Growing Monolith
Distributed monolith is worse than either extreme. Good boundaries matter more than deployment topology.
[Overview] System Overview
The team extracted 5 services thinking it would improve velocity. All 5 shared a database. All deployments coordinated. They had a distributed monolith.
Worse complexity. Same coupling.
[Context] Situation before
Monolith worked. Team believed microservices would help. Extracted services without clear boundaries.
[Diagnosis] The real problem
Services that share a database and coordinate deployments are not microservices. They are a distributed monolith with network latency.
Understanding the root cause changed everything.
[Boundaries] Working constraints
TEAM
- 15 engineers cannot effectively operate 5+ independent services
Constraints are features, not obstacles. They guide design decisions.
[Decisions] Key tradeoffs
DEFERRED
Full microservices
Independent databases, async communication
Team not ready for that complexity.
CHOSEN
Modular monolith
Clear boundaries, single deployment
Captures benefits without operational complexity.
[Design] Architecture design
Merged services back. Kept module boundaries. Explicit interfaces between modules. Single deployment.
Distributed Monolith vs Modular Monolith Premature microservices create worse problems
Distributed Monolith vs Modular Monolith Architecture
[Approach] Execution model
##### Migration
Merged one service per week. Maintained module boundaries through code organization.
[Results] Measurable outcomes
##### Results
40% faster feature delivery. Simpler operations. Team focused on product.
Key improvements achieved:
- System handles 10x burst load without degradation
- Delivery latency reduced from seconds to milliseconds
- Zero message loss during traffic spikes
- Operational complexity reduced by 60%
What could have gone wrong
##### Continued Extraction
More services, same coupling. Network debugging. Worse performance.
- Over-engineering the initial solution
- Ignoring operational constraints during design
- Premature optimization without load testing
- Skipping failure mode analysis
[Applicability] Where this pattern applies
##### Signs of Distributed Monolith
Coordinated deployments. Shared database. Sync service calls.
Every system is different. Context always matters.