Engineering11 min read

Microservices vs Modular Monolith: How to Choose the Right Architecture in 2026

Microservices vs modular monolith: 42% of enterprises are reversing course. Learn how to choose the right architecture for your team and scale in 2026.

The microservices vs modular monolith question sits at the center of nearly every architecture review in 2026. How your team structures its codebase determines your deployment cadence, your operational overhead, your cloud spend, and how many engineers you need to sustain it. The decisions made here compound: a team that over-architectures early spends the next two years managing infrastructure instead of shipping product; a team that under-architectures at scale hits coordination ceilings that slow every feature. If you are building or evolving a SaaS product, the architecture decision is not one-time — it shapes your cost structure, team topology, and ability to grow. Getting it right before you are forced to is one of the highest-leverage calls a technical leader makes.

The data in 2026 has shifted the default assumption. According to a 2025 CNCF survey, 42% of organizations that adopted microservices are now consolidating services back into larger deployable units. Amazon Prime Video's 2023 case study — where they migrated a critical service from distributed microservices back to a monolith and reduced costs by over 90% — became the inflection point that legitimized the reversal. The binary framing of monolith versus microservices has been replaced by a more useful question: what is the simplest architecture that meets your current requirements, while preserving optionality to evolve?

This guide provides the practical decision framework: what a modular monolith is and how it differs from both a traditional monolith and microservices, the specific conditions under which each architecture wins, the concrete practices for implementing a modular monolith that can evolve, and the right migration path when microservices genuinely become necessary. For teams working through multi-tenant data isolation decisions — one of the most consequential SaaS architecture choices — the modular monolith framing often provides the clearest path forward.

What Is a Modular Monolith Architecture?

A modular monolith is a single deployable unit — one process, one deployment pipeline, one database connection pool — in which the internal code is organized into strictly bounded modules that cannot directly access each other's internals. Each module has a defined public API, owns its data schema, and communicates with other modules through well-defined interfaces rather than direct imports or shared tables. The key discipline is the enforcement of these boundaries: not just convention, but compiler-enforced or linter-enforced rules that prevent modules from importing each other's internal types. A modular monolith looks like microservices in the codebase — clear ownership, explicit APIs, no cross-cutting data access — but deploys as one artifact. It provides roughly 90% of microservices' organizational benefits at 10% of the operational cost.

The concept is not new — it is how well-structured software has always been built — but it has been rebranded in contrast to the microservices era. Shopify operates one of the world's largest e-commerce platforms on a modular Ruby on Rails monolith. Stack Overflow served 1.3 billion page views per month from a small server fleet. Basecamp, Linear, and numerous high-velocity SaaS companies run modular monoliths because the operational simplicity pays for itself in engineering hours and cloud spend, especially at team sizes below 50 engineers.

What Is Microservices Architecture and What Does It Actually Give You?

Microservices decompose an application into independently deployable services, each owning a single business capability and communicating over a network — typically HTTP/gRPC or an event bus. Each service has its own datastore, its own deployment pipeline, and its own operational footprint. The canonical benefits are real and valuable — at the team sizes and scale profiles where the operational cost is justified.

  • Independent deployment: each service ships on its own cadence — checkout can deploy daily while billing ships quarterly, without either team blocking the other
  • Independent scalability: a high-load payment processing service can scale horizontally without scaling the entire application
  • Team autonomy: teams own services end-to-end, enabling parallel delivery at large scale without coordination bottlenecks
  • Fault isolation: a crash in one service does not cascade to the entire system with proper circuit-breaker patterns and bulkheads in place
  • Technology heterogeneity: a machine learning service can run Python while the API layer runs Go and the frontend BFF runs Node.js — each polyglot runtime in isolation

Why 42% of Organizations Are Reversing Their Microservices Decision in 2026

The microservices movement peaked in adoption around 2018–2022. By 2025–2026, the engineering leadership community is processing the accumulated cost of premature decomposition, and the pattern is consistent: organizations with under 50 engineers that adopted microservices to build for scale spent the majority of their engineering capacity on distributed systems infrastructure — service discovery, distributed tracing, inter-service authentication, network reliability, and latency debugging — rather than on product. The CNCF survey's 42% consolidation figure reflects teams that found the operational overhead uncompensable at their team size and traffic profile.

Amazon Prime Video's 2023 case study is the canonical example. Their monitoring service had been built as a distributed system with separate microservices for each step in a media analysis pipeline. When they profiled performance, the bottleneck was not compute — it was the network call overhead and orchestration cost between services. They consolidated the services into a single process. Cost dropped by over 90%. Throughput increased. Team operational burden dropped substantially. The lesson is not that microservices are wrong; Prime Video operates thousands of microservices across AWS. The lesson is that microservices are not universally correct, and the correct unit of analysis is the specific component — not a blanket organizational policy.

The Core Trade-Offs: Complexity, Cloud Cost, and Delivery Velocity

  • Operational complexity: a modular monolith has one deployment, one service to monitor, one logging target, one connection pool. A 20-service microservices system has 20 deployments, 20 health checks, distributed traces across 20 services, and 20 authentication surfaces to secure. For teams without dedicated platform engineers, this complexity is a hidden full-time job for product engineers.
  • Development velocity at small scale: modular monolith wins. Local development runs with one command. Integration testing does not require spinning up eight services. Debugging does not require stitching together distributed traces. Engineers spend less time on infrastructure and more time on product.
  • Development velocity at large scale: microservices win. When multiple teams work on the same domain, service ownership prevents deployment serialization and merge conflicts. Teams that would otherwise block each other get genuine autonomy.
  • Cloud cost: a monolith runs on fewer, larger instances. Microservices require container orchestration, service meshes, distributed caching, and inter-service networking — often 3–5× the infrastructure cost of an equivalent monolith at the same load.
  • Testing: modular monolith integration tests are fast, reliable, and cheap — one process, no network. Microservices integration tests require contract testing, consumer-driven contracts, and end-to-end environments that drift and flake. This velocity cost compounds as the number of services grows.
  • Debugging: in a monolith, you add a log line, redeploy, and trace the problem. In microservices, you need distributed tracing, correlation IDs flowing through every service call, and tooling to stitch together a request that spans five services. The tooling exists but must be built and maintained.

When a Modular Monolith Is the Right Architecture

The default architecture for any new product or team below 30–50 engineers in 2026 should be a modular monolith. The conditions under which it is clearly the right choice:

  • Team size under 50 engineers: below this headcount, microservices' team autonomy benefits do not materialize because Conway's Law pressure has not created coordination ceilings yet. The operational overhead is pure cost.
  • You do not yet have product-market fit: the architecture that lets you move fastest and pivot cheapest is the modular monolith — you need to change your mind about domain boundaries frequently, and doing so in a monolith is safe refactoring, while in microservices it requires contract migrations across service boundaries.
  • Scale is under 1 million requests per day: most well-architected monoliths can serve tens of thousands of concurrent users with horizontal scaling behind a load balancer, database read replicas, and caching. You need microservices for independent scaling, not for raw volume at this level.
  • DevOps maturity is limited: fewer than 3–5 dedicated platform engineers means microservices infrastructure will be maintained by product engineers who will resent it. Kubernetes, service meshes, distributed tracing, and container security all require sustained platform investment.
  • Regulatory data residency applies uniformly: if all your tenant data is subject to the same regulatory regime, module separation with access controls is sufficient for most frameworks — you do not need physical service separation for compliance.

When Microservices Are the Right Architecture

Microservices earn their operational cost under specific, demonstrable conditions. The decision to decompose should be driven by specific, measured pain — not anticipated scale that may never arrive:

  • Team size exceeds 50–100 engineers with Conway's Law pressure: when multiple teams need to deploy independently and service ownership is genuinely reducing coordination overhead, microservices deliver on their promise.
  • Independent scaling is genuinely required by a specific component: a media transcoding pipeline, a real-time bidding engine, or a high-throughput webhook processor that needs 100× more compute than the rest of the application justifies service isolation.
  • Polyglot runtime requirements: a machine learning inference service in Python, a high-throughput stream processor in Go, and a CRUD API in Node.js cannot share a single runtime — physical separation is the natural boundary.
  • Regulatory isolation mandates physical separation: some compliance frameworks (PCI DSS for cardholder data, HIPAA for PHI in certain architectures) require physical isolation of specific data and processing that module-level separation does not satisfy.
  • Fault isolation is a hard business requirement: if a background processing failure must be guaranteed not to impact user-facing API availability, physical separation with circuit breakers provides a stronger guarantee than in-process isolation.

How to Build a Modular Monolith with Enforced Domain Boundaries

A modular monolith's value depends entirely on the rigor of its boundaries. A monolith where modules freely import each other's internals is just a ball of mud — it has the deployment simplicity of a monolith without any architectural clarity. The practices that make the modular monolith work in production:

  • Define explicit module APIs and enforce them with tooling: each module exposes a typed public interface (a service class or barrel-exported set of functions); all other code is internal. In TypeScript, use barrel exports (index.ts) and ESLint import boundary rules. In Go, use package-level visibility. In Java or Kotlin, use module-info.java or package-private access modifiers.
  • Own the data schema per module and forbid cross-module direct queries: each module owns its tables or collections and other modules do not query them directly. Cross-module data access goes through the owning module's service API, which applies business rules. This is the hardest discipline to maintain but the most valuable — it is what makes microservices extraction feasible later without data migration nightmares.
  • Communicate through defined interfaces, not shared state: pass typed data transfer objects between modules; do not share mutable state or raw database connections across module boundaries. This mirrors microservices' interface contract discipline without the network latency.
  • Write module integration tests through the public API: test each module through its exported interface, not its internals. These tests become the contract tests that protect you when you extract a module to a microservice and need to verify the behavior contract holds.
  • Map domains before you map modules: use domain-driven design to identify bounded contexts before writing code. The modular monolith's module structure should reflect the business domain — Orders, Payments, Identity, Billing — not technical layers like Controllers, Services, and Repositories.

Migrating from Modular Monolith to Microservices: The Strangler Fig Pattern

When your team grows past the 50-engineer threshold, or a specific component genuinely needs independent deployment, you extract modules into services — not the whole application at once. The strangler fig pattern is the validated approach for incremental migration. Named for the vine that grows around a tree and gradually replaces its trunk, the pattern works like this: add new capabilities as a separate service, introduce a routing layer (an API gateway or facade) that directs traffic to either the monolith or the new service, and progressively migrate existing functionality until the module in the monolith is dormant and can be removed. The critical operational foundation for this migration is having cloud infrastructure and observability in place — container orchestration, distributed tracing, and health check infrastructure must exist before you extract the first service, or you are building the plane while flying it.

The prerequisite that makes extraction tractable is the clean module boundaries you enforced in the monolith. If you built with enforced module APIs and owned data schemas, extraction is a bounded operation: move the module's code to a new repository, move its schema, update the routing layer to point to the new service endpoint. If modules shared data tables, extraction requires dual-write periods, eventual consistency management, and a schema migration that is the primary failure mode in microservices migrations. See our analysis of Kubernetes cost and operational trade-offs for what the microservices operational footprint looks like once you have extracted services and need to sustain the infrastructure.

Frequently Asked Questions

What is a modular monolith and how is it different from a regular monolith?

A modular monolith is a single-process application organized into strictly bounded internal modules with enforced API boundaries, owned data schemas, and no direct cross-module data access. A traditional monolith lacks these boundaries — modules share database tables, import each other's internals freely, and evolve into a tightly coupled system where every change risks breaking something unrelated. A modular monolith imposes the same domain discipline as microservices but in a single deployment, giving you clean architecture without distributed systems complexity.

When should a startup use microservices instead of a modular monolith?

A startup should seriously consider microservices when it has more than 50 engineers who need independent deployment autonomy that is genuinely being blocked, has a component with divergent scaling requirements that cannot be addressed by vertical scaling or caching, or has a regulatory compliance requirement that mandates physical isolation of specific data. Before those conditions are demonstrated — not anticipated — a modular monolith ships faster, costs significantly less, and is far easier to debug and operate.

Can a modular monolith scale to millions of users?

Yes. Shopify's core commerce platform handles millions of merchants and billions of transactions on a modular Ruby on Rails monolith. Stack Overflow serves billions of page views from a small server fleet. Scaling a well-architected monolith is a matter of horizontal scaling behind a load balancer, database read replicas, connection pooling, and in-process caching — none of which requires service decomposition. Most organizations never encounter a scaling problem that genuinely requires microservices; they encounter team coordination problems, which is the correct signal to consider decomposition.

What is the strangler fig pattern for microservices migration?

The strangler fig pattern is an incremental migration strategy where you extract a monolith to microservices one module at a time, rather than in a big-bang rewrite. You introduce an API gateway or routing facade in front of the monolith, add new capabilities as separate services that the gateway routes to, and progressively redirect existing functionality from the monolith to extracted services. At no point is the entire system unavailable or in a half-migrated state that cannot be rolled back. The pattern requires clean module data ownership in the monolith — without it, the database migration becomes the bottleneck and the primary failure mode.

Is it safe to migrate from microservices back to a modular monolith?

Yes, and in 2026 it is increasingly common. The migration requires merging service codebases, consolidating databases (or maintaining separate stores accessed through module interfaces), and removing the distributed infrastructure — service mesh, per-service deployments, inter-service authentication — that existed only to support the decomposition. The main risk is database consolidation when services share data that must remain consistent during the cutover. Teams that have consolidated microservices to modular monoliths consistently report 40–90% reductions in cloud spend and measurable improvements in developer productivity and debugging time.

How Belsoft Helps Engineering Teams Choose and Build the Right Architecture

Architecture decisions made early compound across every sprint that follows. Belsoft works with technical founders and engineering leaders to make the modular monolith vs microservices call with clarity — scoping your current team size, scale requirements, DevOps maturity, and compliance obligations to identify the architecture that will ship the most product with the least overhead at your stage. Whether you are building a SaaS product from the ground up or re-architecting a system that has grown past its original design, the principle is the same: the right architecture is the simplest one that meets your requirements today and preserves clean paths to evolve as your team and traffic scale.

Belsoft's engineering engagements typically start with an architecture review: mapping existing domain boundaries, identifying where coupling is creating delivery friction, and proposing a migration path that reduces risk rather than accumulating it. Review our engineering work to see what that looks like in practice, or talk to us about your architecture decision if you are facing a specific choice now.

The right architecture is the simplest one that meets your requirements today and can evolve cleanly as your needs change. Complexity borrowed against future scale you may never hit is the most expensive debt in software.

Written by

Belsoft Team

Ready to build?

Let's talk about your project.

30 minutes. No pitch. We map your requirements and tell you honestly what it will take.

Book a Strategy Call
logo

Enterprise software engineering SaaS, AI, cloud, and security for companies that need more than an agency.

Copyright Ⓒ 2026 BelSoft. All Rights Reserved.

social-media-1social-media-2social-media-3social-media-4