All work
Architecture PatternPlatform architecture

One application with clear boundaries, split only when the evidence says to

Skip the cost and complexity of microservices until there’s a real reason to pay it.

Context

A team starting a new system, or reshaping an existing one, and deciding whether to begin with microservices: splitting the system into many small services that are deployed and run separately.

The problem

Teams reach for microservices by default and start paying the price, in network calls, partial failures, and harder deployment and debugging, long before they have a reason to.

Constraints

  • One thing to deploy and debug while the system is young.
  • Connections to outside systems must stay isolated behind clear boundaries.
  • Splitting a piece out later has to remain possible.

Approach

Start with one application, with clear boundaries between its parts. The parts that talk to outside systems sit behind connectors with a defined interface, and everything else ships as one unit. The boundaries exist so a piece can be split off later, but only when there is a real reason to.

Key engineering decisions

  • One deployable now

    A single application avoids network calls, partial failures, and distributed debugging until they buy something.

  • Clear boundaries around outside systems

    Outside systems sit behind connectors with a defined interface, so the boundary a future separate service would need already exists.

  • Split on evidence

    A piece moves into its own service when there is evidence it needs to, not as a stance taken on day one.

What it demonstrates

One thing to deploy and debug now, with the option to break pieces off later: the split becomes a decision made on evidence, not a stance taken on day one.

Technologies

  • Modular monolith
  • Domain-driven design
  • Out-of-process connectors
  • .NET

Related expertise

Working through something similar?

Tell us what you have in mind. We’ll work out the next step together.

Start a Conversation