The architecture pendulum has swung
The microservices-by-default era is over. The modular-monolith pattern has reasserted itself, and most teams in 2026 are happier with a well-structured monolith than they would be with five microservices doing the same job. The question isn't "monolith or microservices" — it's "when does the cost of distribution start paying off, and how do I avoid the worst of both".The modular monolith — the right default
A modular monolith is a single deployable that's organised internally as separate modules with explicit interfaces. The pattern:- Modules expose narrow APIs (functions or events) to each other; no direct database access across module boundaries
- Each module owns its tables; if a foreign module needs the data, it goes through the API
- The build enforces module boundaries — Maven multi-module, dotnet projects, package boundaries in Go, etc.
- One deployable, one process, one database (or one logical database per module within shared infra)
What you get: low operational overhead, fast in-process calls, single transaction boundaries, simple deployment. Most of the maintainability benefits of microservices without the cost.
When it stops being enough
Move a module out to its own service when:- The module has materially different scaling characteristics from the rest (e.g. video transcoding inside a CRUD app)
- The module has materially different reliability requirements (e.g. payment processing needing higher availability than the surrounding admin tooling)
- The team boundary has shifted — a separate team is going to own this and they need autonomy on deploy cadence
- The technology mismatch is real — one module is genuinely better in a different language / runtime
Don't extract for "microservices best practice". Extract for a specific reason that survives a sceptical review.