Skip to content
Mohit Swami

$ note

Microservices: When They're Worth It (And When They Aren't)

A practical threshold for splitting systems based on operational reality, not fashion.

architecturemicroservicesgovernanceoperations

Feb 12, 2024 · 4 min read

The threshold is operational, not architectural

Microservices are a structural response to operational pressure. When a system is small, the highest risk is not code coupling but misaligned change and unclear accountability. The boundary between services should appear when coordination costs exceed the cost of running one thing. That threshold shows up as release trains, shared deployment fear, and the inability to isolate a failure without freezing the entire product.

In compliance-heavy domains, the pressure is amplified. A single audit requirement can ripple across unrelated areas, and the safest change is the smallest possible blast radius. If you cannot change an onboarding workflow without also touching reporting or billing, you have a boundary problem, not a scaling problem.

Field note

If the main reason is “we might scale later,” keep the system together and invest in testing, observability, and clear internal interfaces first.

Signals it’s worth it

Microservices start to pay for themselves when the organization is already paying a real tax for shared ownership. You see this when multiple teams are blocked on each other, or when a single change requires coordinated deployments across unrelated features.

Common signals that the split is worth it:

  • Teams own distinct business capabilities with different release cadences.
  • Data lifecycles diverge and require separate retention policies.
  • Reliability or compliance requirements are materially different across domains.
  • Load patterns are uneven, and scaling one area forces waste elsewhere.
  • Incidents in one area should not halt others, but currently do.

Even with these signals, you still need to map data ownership. If you cannot draw clean boundaries around who writes to which records, the split becomes a distributed tangle.

Operational readiness

Splitting services only helps when you can operate them independently. That means reliable deploys, shared observability, and an on-call model that knows who owns which service. If a production incident still requires every team to jump in, the services are not actually independent. Invest in runbooks, alert hygiene, and clear SLOs before multiplying the number of deployments.

Signals it’s premature

Microservices add operational overhead: more deployable units, more observability, and more failure modes. If your team is still stabilizing a single service, splitting early will multiply the problem.

Anti-signals include:

  • A single small team with shared context and a stable domain model.
  • A product surface that is still changing daily.
  • A shared database that cannot be cleanly partitioned.
  • No on-call rotation or observability discipline.
  • A need for cross-service transactions that cannot be redesigned.

If these are true, invest in a modular monolith and revisit the split when coordination costs rise.

Contracts and governance keep you honest

Once you split, you are trading in-process calls for contracts. That means API schemas, event definitions, and compatibility rules. Without governance, you create a distributed monolith where every change is a breaking change disguised as a release.

Good governance is boring but effective: versioned schemas, consumer-driven tests, and clear ownership of breaking changes. It also means documenting why a boundary exists, so new engineers do not “optimize” it away.

Starting with a modular monolith

Most systems should begin as a modular monolith. Build clear package boundaries, expose internal APIs, and log interactions as if they were network calls. This forces discipline without operational overhead.

When the split becomes necessary, you already have separable modules, data access boundaries, and a logging model that maps to services. Extraction becomes a controlled change instead of a rewrite.

A decision checklist

Before committing to a microservices architecture, answer these questions in writing:

  • Which teams own which services, and what is the escalation path?
  • What data does each service own, and how is sharing handled?
  • How will you enforce compatibility for events and APIs?
  • What new failure modes are introduced, and who mitigates them?
  • How will you observe and debug multi-hop requests?
  • What is the rollback strategy when a dependency fails?

If the answers are vague, the split will likely hurt more than it helps. If the answers are clear, microservices can be a pragmatic tool for long-lived, compliance-heavy systems.

$ more

$ related