Back to Home
// guide / architecture

Monolith vs microservices — the honest tradeoff

Start with a monolith. Split into services when specific teams, scaling, or deployment constraints force your hand — not before. The industry over-corrected on microservices for a decade.

Start with a monolith. Break into services only when a specific pain point (team scaling, deployment coupling, or a genuine performance bottleneck) forces it. The default answer in 2026 has swung back toward 'well-modularized monolith', and it's the right call for 95% of teams under 100 engineers.

What the terms actually mean

  • MonolithOne deployable application. All the business logic ships together, talks to one (or a small number of) databases, and is developed in one codebase. Doesn't mean 'one giant messy file' — a well-organized monolith has modules, boundaries, and internal APIs.
  • MicroservicesThe application is split into many small services, each independently deployed, each with its own database (typically). Services communicate over network calls (HTTP/gRPC/message bus). Popularized by Netflix and Amazon; over-adopted everywhere else.
  • Modular monolithThe compromise most senior engineers now recommend. One deployable, but internally structured as clear modules with strict boundaries. If you later need to split a module into a service, the code is already ready for it.
  • Service-oriented architecture (SOA)The 'macroservices' version. A few large services (5–15), not dozens. Often the right destination for teams that outgrow a monolith but shouldn't go to full microservices.

Why microservices got over-adopted

From about 2014 to 2020, microservices were sold as the enterprise-scale answer to slow monoliths. The pitch: independent deployment, team autonomy, technology diversity, horizontal scaling. All real benefits — for organizations that actually had the constraints those benefits solve. For everyone else, microservices imported enterprise problems (distributed transactions, cross-service debugging, network reliability, coordinated deployments) without the enterprise benefits. Most 20-engineer teams that adopted microservices spent 30–50% of their engineering capacity managing infrastructure that a monolith would have handled for free.

When to actually reach for services

  • Team scaleYou have 40+ engineers and they're stepping on each other's deployments. Cutting the codebase along team boundaries (one team owns one service) removes coordination cost. Under 20 engineers, this doesn't apply — you can share a monolith easily.
  • Genuine scaling asymmetryOne part of the app needs 100x the resources of the rest — e.g. a real-time inference layer, a heavy background job queue, a file processing pipeline. Extract that part to a service so it scales independently. Don't extract everything.
  • Compliance or security isolationSome data (PHI, PCI card data, defense-sensitive) legitimately needs to live in an isolated system with different access controls. Splitting it out is architecture-driven, not fashion-driven.
  • Technology mismatchOne part of the system genuinely needs a different runtime — a Rust service for latency, a Python service for ML. That's a valid reason to split. 'We want to try Kotlin for this new feature' is not.

What a well-built modular monolith looks like

The compromise that's winning in 2026. One deployable, one database (or a small set), but the code is organized into modules with strict internal boundaries. Modules communicate through explicit interfaces, not by reaching into each other's tables. When (if) you need to split a module into a service later, the interface is already the network boundary — the refactor is mechanical, not architectural.

  • Clear module boundariesPayments, billing, users, notifications each live in their own folder with a defined public API. No module imports another module's internal files.
  • Shared database, module-scoped schemasPostgres with a schema per module. Each module can only write to its own schema; cross-module reads go through the module's API, not raw SQL.
  • One CI/CD pipeline, feature flags for rolloutDeploy the whole app together, use feature flags to gate risky changes. This is faster and safer than the microservices dance for teams under 50 engineers.
  • One observability surfaceOne log stream, one tracing system, one alert configuration. Debugging is dramatically simpler than in a distributed system.

The cost of the wrong choice

Choosing microservices too early is the most expensive architectural mistake we regularly clean up. Typical cost of unwinding a premature microservices decomposition for a 15-engineer team: 3–6 months of dedicated work, $250K–$600K of engineering time, and a lot of caution about ever changing architecture again. Choosing a monolith too long (past 40 engineers) has costs too, but the costs are gradual — coordination friction, slower releases — and the pivot to services is more targeted (extract one service at a time). Late-monolith regret is a bad quarter. Early-microservices regret is a bad year.

// frequently asked

Common questions

Isn't Netflix's success proof that microservices work?

Netflix's success is proof that microservices work for Netflix, at Netflix's scale, with Netflix's engineering headcount and expertise. Cargo-culting their architecture without their constraints is the origin of most microservices regret. Ask yourself if you have Netflix's problems before adopting Netflix's solutions.

How many engineers before I should split from a monolith?

There's no exact number, but the pain signal is when merges start conflicting daily, deployments start requiring cross-team coordination meetings, and one team's broken build blocks another team from shipping. That typically shows up between 30 and 60 engineers depending on how disciplined the module boundaries are. Under 20, don't split. Between 20 and 40, consider a modular monolith. Above 40, start extracting specific services with real justifications.

What about serverless / functions-as-a-service?

Serverless is orthogonal — you can run a monolith on Lambda, or a microservices system on always-on containers. Serverless makes the most sense for event-driven workloads with spiky traffic. It's usually not a great fit for the main application server, where you'll pay cold-start costs and lose local reasoning about the codebase.

How do I know if my monolith has grown too big?

Real signals: (1) new engineers need 2+ weeks to make a first meaningful commit because the codebase is opaque, (2) tests take longer than 10 minutes to run, (3) one bad migration blocks the whole app for hours. Refactor internal modularity first; only split into services if the modularity refactor doesn't fix the pain.

Is Kubernetes required for microservices?

Not required, but common. Kubernetes is well-suited to running many small services. If you're not sure you need microservices, you almost certainly don't need Kubernetes. Managed platforms (Fly.io, Railway, Render, ECS Fargate) run monoliths and small service meshes with dramatically less operational overhead.

Have a specific situation? Talk to an engineer at NextGen — we do free 30-minute scoping calls with a senior developer, not a salesperson.

// let's build something

Start your project request

Tell us what you're building — engineering capacity, AI, QA, cloud, or a fixed-scope software engagement. Our NYC team responds within one business day.

// what to expect
  • Response within 1 business day
  • 30-minute discovery conversation
  • Recommended engagement model & pricing
  • NYC-focused — in-person available
Start Project Request

Inbound sales only. All form information is encrypted in transit.