The microservices hype cycle has matured. The question is no longer "should we decompose?" but "what decomposition boundary is right for us, today?" Premature microservices decomposition is as common a failure mode as the big-ball-of-mud monolith. This article shares the decision matrix we use with clients to find the right answer for their context.
The Questions That Actually Matter
We start every architecture decomposition discussion with four questions:
- Team topology: How many teams need to work on this system independently? Microservices boundaries should align with team boundaries. If one team owns the entire system, a monolith (or a modular monolith) is probably correct.
- Scaling requirements: Do different parts of the system have meaningfully different load profiles that would benefit from independent scaling? If the answer is no, microservices add infrastructure complexity for no performance benefit.
- Deployment independence: Is there business value in deploying parts of the system independently? If releases are always coordinated anyway, service boundaries don't reduce coupling.
- Operational maturity: Does the team have the platform capabilities — observability, service mesh, distributed tracing — to operate microservices effectively? Without these, microservices create incidents that monoliths wouldn't.
The Modular Monolith: The Middle Path
The modular monolith is an underappreciated architecture that answers "yes" to team scalability and "no" to distributed deployment. A single deployable unit with strict internal module boundaries enforced by architecture tests. Modules communicate through well-defined interfaces (events or direct service calls); no module can access another module's data store directly.
We've guided three clients from a big-ball-of-mud monolith to a modular monolith in the last two years. In each case, the modular monolith was significantly easier to deliver than a full microservices decomposition, and it achieved the primary goal: independent team velocity. The option to extract a module as a service later remains open — and is much easier from a modular monolith than from an unstructured monolith.
- Match service boundaries to team boundaries, not perceived technical concerns
- The modular monolith is the right answer for many teams that think they need microservices
- Operational maturity must precede microservices adoption, not follow it
- Decomposition is reversible from a modular monolith; it's expensive from a big-ball-of-mud