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.